splat在这做什么?

时间:2009-09-21 18:46:25

标签: ruby splat

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

我知道这是在进行某种正则表达式匹配,但是splat在这里扮演什么角色,有没有办法在没有splat的情况下做到这一点,所以它不那么令人困惑?

5 个答案:

答案 0 :(得分:5)

splat正在将正则表达式匹配结果(一个MatchData分解为三个组:整个模式,字母和数字)分为三个变量。所以我们最终得到:

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

没有splat,只有一个结果(MatchData),所以Ruby不知道如何将它分配给三个独立的变量。

答案 1 :(得分:3)

documentation for MatchData中有一个很好的解释:

  

因为扩展时会调用to_a   *变量,有一个有用的赋值快捷方式,用于提取匹配的   领域。这比稍慢   直接访问字段(作为   生成中间数组)。

   all,f1,f2,f3 = *(/(.)(.)(\d+)(\d)/.match("THX1138."))
   all   #=> "HX1138"
   f1    #=> "H"
   f2    #=> "X"
   f3    #=> "113"

答案 2 :(得分:3)

  

有没有办法在没有splat的情况下做到这一点,所以它不那么令人困惑?

由于a,b = [c,d]a,b = *[c,d]相同,并且splat在其操作数上调用to_a,当它不是数组时,您可以简单地调用to_a而不需要splat:

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

不知道这是不是那么令人困惑,但它是无懈可击的。

答案 3 :(得分:0)

String.match返回一个MatchData对象,该对象包含正则表达式的所有匹配项。 splat运算符拆分此对象并分别返回所有匹配。

如果你刚开始

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

在irb中,您可以看到MatchData对象,并收集匹配项。

答案 4 :(得分:0)

MatchData是一个特殊变量,对于所有意图和目的而言,一个数组(种类),所以你实际上也可以这样做:

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

Learn more about the special variable MatchData