From: Tanaka Akira Date: 2008-05-01T21:54:15+09:00 Subject: [ruby-dev:34562] Re: /(.)(.)/.match("ab").select {|v| true } is empty In article , Yukihiro Matsumoto writes: > MatchData#selectはvalues_atのaliasですからEnumerable系の > selectとは挙動が異なります。戻り値は指定した引数をインデック > スとする値を要素とする配列です。RDocには以下のようにあります。 おぉ、rdoc は読んでませんでした。 しかし、その説明は 1.8.1 から 1.8.6 までの挙動とあっていません。 % ruby-1.8.6 -ve 'p(/(.)(.)(\d+)(\d)/.match("THX1138: The Movie").select(0, 2, -2))' ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux] -e:1:in `select': wrong number of arguments (3 for 0) (ArgumentError) from -e:1 % ruby-1.8.6 -ve 'p(/(.)(.)(\d+)(\d)/.match("THX1138: The Movie").select { true })' ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-linux] ["HX1138", "H", "X", "113", "8"] 説明がついたのは 1.8.2 ですが、その段階で実際の挙動と説明に 食い違いがあります。 説明はまつもとさんのいうように values_at ですが、実装は Enumerable 的なものです。 そして、1.8.0 は values_at と Enumerable 的なものが混ざって いて、values_at のほうは values_at 自体を使えという警告が出 ます。 % ruby-1.8.0 -ve 'p(/(.)(.)(\d+)(\d)/.match("THX1138: The Movie").select(0, 2, -2))' ruby 1.8.0 (2003-08-04) [i686-linux] -e:1: warning: MatchData#select(index..) is deprecated; use MatchData#values_at ["HX1138", "X", "113"] % ruby-1.8.0 -ve 'p(/(.)(.)(\d+)(\d)/.match("THX1138: The Movie").select { true })' ruby 1.8.0 (2003-08-04) [i686-linux] ["HX1138", "H", "X", "113", "8"] これをみると、むしろ rdoc による説明が間違っていて、その間違っ た説明に 1.9 が従ってしまったと思えるのですがどうでしょうか? (そして、1.8.7 にそれが backport されて非互換性が発生してお り、rubyspec で検出されるのですが。) -- [田中 哲][たなか あきら][Tanaka Akira]