[英]What's the splat doing here?
match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
我知道这是在进行某种正则表达式匹配,但是splat在这里扮演什么角色,有没有办法在没有splat的情况下这样做,所以它不那么令人困惑?
splat将正则表达式匹配结果(具有三个组的MatchData
:整个模式,字母和数字)分解为三个变量。 所以我们最终得到:
match = "foobar 123"
text = "foobar"
number = "123"
没有splat,只有一个结果( MatchData
),所以Ruby不知道如何将它分配给三个独立的变量。
有没有办法在没有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
不知道这是不是那么令人困惑,但它是无懈可击的。
String.match返回一个MatchData对象,该对象包含正则表达式的所有匹配项。 splat运算符拆分此对象并分别返回所有匹配项。
如果你只是跑
"foobar 123".match(/([A-z]*) ([0-9]*)/)
在irb中,您可以看到MatchData对象,并收集匹配项。
MatchData是一个特殊的变量,对于所有意图和目的而言,一个数组(种类),所以你实际上也可以这样做:
match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/)[0..2]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.