From: Yukihiro Matsumoto Date: 2008-05-01T21:23:23+09:00 Subject: [ruby-dev:34561] Re: /(.)(.)/.match("ab").select {|v| true } is empty まつもと ゆきひろです In message "Re: [ruby-dev:34556] /(.)(.)/.match("ab").select {|v| true } is empty" on Thu, 1 May 2008 16:20:53 +0900, Tanaka Akira writes: |以下のように、MatchData#select でブロックが常に真なのに結果 |が空になるのは変ではないでしょうか。 MatchData#selectはvalues_atのaliasですからEnumerable系の selectとは挙動が異なります。戻り値は指定した引数をインデック スとする値を要素とする配列です。RDocには以下のようにあります。 mtch.values_at([index]*) => array mtch.select([index]*) => array Uses each index to access the matching values, returning an array of the corresponding matches. m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie") m.to_a #=> ["HX1138", "H", "X", "113", "8"] m.values_at(0, 2, -2) #=> ["HX1138", "X", "113"] |マニュアルには self.to_a.select { ... } と同じと書いてありま |すが、そうすると空ではなくなります。 ですから、これは「マニュアル」の間違いだと思います。訂正した 方がよいでしょうね。 それはそれとして、selectという名前は誤解を生みやすいので、 * 削除 or 改名する * 引数が無い and/or ブロックが与えられている場合には積極的 にエラーまたは警告にする。 などの対策をすることは良いことだと思います。 まつもと ゆきひろ /:|)