[#43494] ブロックとともに呼び出されたsortについて — "Toshiyuki Ogura" <oguradio@...>

小倉です。

12 messages 2007/05/15

[#43508] rubyのテキストについて — 桑江 康公 <ykuwae@...>

はじめまして、桑江といいます。プログラム開発の勉強をはじめたいと考えています。いろいろと調べたのですが、オブジェクト指向を使った開発が現在しりゅうとのことで、Javaを勉強しようと考えていたのですが、rubyという言語もあるということがわかりネットで調べたところこのメーリングリストにたどり着きました。どなたかプログラム開発初心者でもわかりやすい本またはサイトがありましたら教えていただけないでしょうか?ちなみに、私のレベルはHTMLが少しわかる程度です。

8 messages 2007/05/15

[ruby-list:43529] Re: 正規表現のマッチングの書式について

From: "NARUSE, Yui" <naruse@...>
Date: 2007-05-17 07:07:02 UTC
List: ruby-list #43529
naruseです。

Toshiyuki Ogura さんは書きました:
> 正規表現 =~ 文字列
> と書いても、
> 文字列 =~ 正規表現
> と書いても、どちらでもいいということなのでしょうか。

正規表現 =~ 文字列 の形で呼ぶと、Regexp#=~ が呼ばれるわけですが、
これは re.c で定義されており、
    rb_define_method(rb_cRegexp, "=~", rb_reg_match, 1);
となっています。
つまり、実体は rb_reg_match です。

さて、文字列 =~ 正規表現 では String#=~ が呼ばれるわけですが、
これは string.c で定義されており、rb_str_match に行きます。
   rb_define_method(rb_cString, "=~", rb_str_match, 1);

この rb_str_match は以下のようになっており、
static VALUE
rb_str_match(x, y)
    VALUE x, y;
{
    switch (TYPE(y)) {
      case T_STRING:
        rb_raise(rb_eTypeError, "type mismatch: String given");

      case T_REGEXP:
        return rb_reg_match(y, x);

      default:
        return rb_funcall(y, rb_intern("=~"), 1, x);
    }
}
y、つまり引数が正規表現の場合、結局 rb_reg_match を呼んでいます。

つまり、行き着く先は同じで、String#=~ は糖衣構文ということです。

-- 
NARUSE, Yui  <naruse@airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA

In This Thread