3
match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)

これがある種の正規表現の一致を行っていることは知っていますが、ここで感嘆符はどのような役割を果たしているのでしょうか。

4

5 に答える 5

5

splat は、正規表現の一致結果 (MatchDataパターン全体、文字、数字の 3 つのグループ) を 3 つの変数に分解しています。したがって、最終的には次のようになります。

match = "foobar 123"
text = "foobar"
number = "123"

スプラットがなければ、結果は 1 つ ( MatchData) しかないため、Ruby はそれを 3 つの個別の変数に割り当てる方法を知りません。

于 2009-09-21T18:50:45.497 に答える
3

スプラットなしでこれを行う方法はありますか?

a,b = [c,d]同じなので、オペランドが配列ではない場合、そのオペランドに対して splat を呼び出します。to_a を明示的に呼び出すだけで、splat は必要ありません。a,b = *[c,d]to_a

match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/).to_a

混乱が少ないかどうかはわかりませんが、スプラットレスです.

于 2009-09-21T20:38:32.857 に答える
3

MatchDataのドキュメントには、適切な説明があります。

*variable を展開するときに to_a が呼び出されるため、一致したフィールドを抽出するための便利な代入ショートカットがあります。これは、フィールドに直接アクセスするよりもわずかに遅くなります (中間配列が生成されるため)。

   all,f1,f2,f3 = *(/(.)(.)(\d+)(\d)/.match("THX1138."))
   all   #=> "HX1138"
   f1    #=> "H"
   f2    #=> "X"
   f3    #=> "113"
于 2009-09-21T18:51:22.780 に答える
0

MatchData は特別な変数であり、すべての意図と目的のために配列 (一種) であるため、実際にはこれも行うことができます。

match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/)[0..2]

特殊変数 MatchData の詳細

于 2009-09-21T19:24:22.700 に答える
0

String.match は、正規表現のすべての一致を含む MatchData オブジェクトを返します。splat 演算子はこのオブジェクトを分割し、すべての一致を個別に返します。

走るだけなら

"foobar 123".match(/([A-z]*) ([0-9]*)/)

irb では、一致が収集された MatchData オブジェクトを確認できます。

于 2009-09-21T18:50:36.217 に答える