啪嗒啪嗒在这里做什么?

发布于 2024-08-04 22:11:20 字数 169 浏览 7 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

任性一次 2024-08-11 22:11:20

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

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

如果没有 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:

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

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.

玩物 2024-08-11 22:11:20

有没有一种方法可以在不使用 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

不知道这是否不那么令人困惑,但它是无 splatless 的。

is there a way to do this without the splat so it's less confusing?

Since a,b = [c,d] is the same as a,b = *[c,d] and splat calls to_a on its operand when it's not an array you could simply call to_a explicitly and not need the splat:

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

Don't know whether that's less confusing, but it's splatless.

携余温的黄昏 2024-08-11 22:11:20

MatchData 文档中有一个很好的解释:

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

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

There's a good explanation in the documentation for MatchData:

Because to_a is called when expanding
*variable, there‘s a useful assignment shortcut for extracting matched
fields. This is slightly slower than
accessing the fields directly (as an
intermediate array is generated).

   all,f1,f2,f3 = *(/(.)(.)(\d+)(\d)/.match("THX1138."))
   all   #=> "HX1138"
   f1    #=> "H"
   f2    #=> "X"
   f3    #=> "113"
内心荒芜 2024-08-11 22:11:20

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

如果您只是

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

在 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

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

in irb, you can see the MatchData object, with the matches collected.

眼中杀气 2024-08-11 22:11:20

MatchData 是一个特殊的变量,出于所有意图和目的,它是一个数组(某种),因此您实际上也可以这样做:

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

了解有关特殊变量 MatchData 的更多信息

MatchData is a special variable, for all intents and purposes an array (kind of) so you can in fact do this as well:

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

Learn more about the special variable MatchData

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文