match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
これがある種の正規表現の一致を行っていることは知っていますが、ここで感嘆符はどのような役割を果たしているのでしょうか。
splat は、正規表現の一致結果 (MatchData
パターン全体、文字、数字の 3 つのグループ) を 3 つの変数に分解しています。したがって、最終的には次のようになります。
match = "foobar 123"
text = "foobar"
number = "123"
スプラットがなければ、結果は 1 つ ( MatchData
) しかないため、Ruby はそれを 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
混乱が少ないかどうかはわかりませんが、スプラットレスです.
MatchDataのドキュメントには、適切な説明があります。
*variable を展開するときに to_a が呼び出されるため、一致したフィールドを抽出するための便利な代入ショートカットがあります。これは、フィールドに直接アクセスするよりもわずかに遅くなります (中間配列が生成されるため)。
all,f1,f2,f3 = *(/(.)(.)(\d+)(\d)/.match("THX1138.")) all #=> "HX1138" f1 #=> "H" f2 #=> "X" f3 #=> "113"
MatchData は特別な変数であり、すべての意図と目的のために配列 (一種) であるため、実際にはこれも行うことができます。
match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/)[0..2]
String.match は、正規表現のすべての一致を含む MatchData オブジェクトを返します。splat 演算子はこのオブジェクトを分割し、すべての一致を個別に返します。
走るだけなら
"foobar 123".match(/([A-z]*) ([0-9]*)/)
irb では、一致が収集された MatchData オブジェクトを確認できます。