啪嗒啪嗒在这里做什么?
match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
我知道这是在进行某种正则表达式匹配,但是 splat 在这里扮演什么角色,有没有办法在不使用 splat 的情况下做到这一点,这样就不那么混乱了?
match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
I know this is doing some kind of regular expression match but what role does the splat play here and is there a way to do this without the splat so it's less confusing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
splat 将正则表达式匹配结果(包含三组的
MatchData
:整个模式、字母和数字)分解为三个变量。所以我们最终得到的结果是:如果没有 splat,则只有一个结果(
MatchData
),因此 Ruby 不知道如何将其分配给三个单独的变量。The splat is decomposing the regex match results (a
MatchData
with three groups: the whole pattern, the letters, and the numbers) into three variables. So we end up with:Without the splat, there'd only be the one result (the
MatchData
) so Ruby wouldn't know how to assign it to the three separate variables.由于
a,b = [c,d]
与a,b = *[c,d]
相同,并且 splat 调用to_a
当它的操作数不是数组时,您可以简单地显式调用 to_a 而不需要 splat:不知道这是否不那么令人困惑,但它是无 splatless 的。
Since
a,b = [c,d]
is the same asa,b = *[c,d]
and splat callsto_a
on its operand when it's not an array you could simply call to_a explicitly and not need the splat:Don't know whether that's less confusing, but it's splatless.
MatchData 文档中有一个很好的解释:
There's a good explanation in the documentation for MatchData:
String.match返回一个MatchData对象,其中包含正则表达式的所有匹配项。 splat 运算符分割该对象并分别返回所有匹配项。
如果您只是
在 irb 中运行,您可以看到 MatchData 对象,其中包含收集的匹配项。
String.match returns a MatchData object, which contains all the matches of the regular expression. The splat operator splits this object and returns all the matches separately.
If you just run
in irb, you can see the MatchData object, with the matches collected.
MatchData 是一个特殊的变量,出于所有意图和目的,它是一个数组(某种),因此您实际上也可以这样做:
了解有关特殊变量 MatchData 的更多信息
MatchData is a special variable, for all intents and purposes an array (kind of) so you can in fact do this as well:
Learn more about the special variable MatchData