ruby 中字符串前面的 * 有何作用?

发布于 2024-09-29 16:16:18 字数 105 浏览 8 评论 0原文

这段代码似乎创建了一个范围从 a 到 z 的数组,但我不明白 * 的作用。有人可以解释一下吗?

[*"a".."z"]

This code seems to create an array with a range from a to z but I don't understand what the * does. Can someone please explain?

[*"a".."z"]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(3

小草泠泠 2024-10-06 16:16:18

它称为 splat 运算符

绘制左值

最多可以分解一个左值,在这种情况下,它会被分配一个由缺少相应左值的剩余右值组成的数组。如果最右边的左值被展开,那么它会消耗所有尚未与左值配对的右值。如果一个splatted左值后面跟着其他左值,它会消耗尽可能多的右值,同时仍然允许后面的左值接收它们的右值。

<前><代码>*a = 1
一个#=> [1]

a, *b = 1, 2, 3, 4
一个#=> 1
b #=> [2,3,4]

a、*b、c = 1、2、3、4
一个#=> 1
b #=> [2, 3]
c#=> 4

空拍

左值可以由一个星号(U+002A)组成,没有任何关联的标识符。它的行为如上所述,但不是将相应的右值分配给展开的左值,而是丢弃它们。

<前><代码>a, *, b = *(1..5)
一个#=> 1
b #=> 5

绘制右值

当右值被 splatted 时,它会使用 Kernel.Array() 转换为数组,其中的元素本身就会成为右值。

<前><代码>a, b = *1
一个#=> 1
b #=>零

a、b = *[1, 2]
一个#=> 1
b #=> 2

a、b、c = *(1..2), 3
一个#=> 1
b #=> 2
c#=> 3

It's called splat operator.

Splatting an Lvalue

A maximum of one lvalue may be splatted in which case it is assigned an Array consisting of the remaining rvalues that lack corresponding lvalues. If the rightmost lvalue is splatted then it consumes all rvalues which have not already been paired with lvalues. If a splatted lvalue is followed by other lvalues, it consumes as many rvalues as possible while still allowing the following lvalues to receive their rvalues.

*a = 1
a #=> [1]

a, *b = 1, 2, 3, 4
a #=> 1
b #=> [2, 3, 4]

a, *b, c = 1, 2, 3, 4
a #=> 1
b #=> [2, 3]
c #=> 4

Empty Splat

An lvalue may consist of a sole asterisk (U+002A) without any associated identifier. It behaves as described above, but instead of assigning the corresponding rvalues to the splatted lvalue, it discards them.

a, *, b = *(1..5)
a #=> 1
b #=> 5

Splatting an Rvalue

When an rvalue is splatted it is converted to an Array with Kernel.Array(), the elements of which become rvalues in their own right.

a, b = *1
a #=> 1
b #=> nil

a, b = *[1, 2]
a #=> 1
b #=> 2

a, b, c = *(1..2), 3
a #=> 1
b #=> 2
c #=> 3
狼性发作 2024-10-06 16:16:18

splat 运算符将范围扩展为数组。

The splat operator expands the range into an array.

·深蓝 2024-10-06 16:16:18

呵呵,有趣的事实。当您这样做时:

*(0..50)

您会收到错误。

在这种情况下,splat 操作符需要一个接收器才能工作。因此,不要仅仅在没有接收器的情况下尝试它,从而欺骗自己认为它在 irb 中损坏了。

Huh, fun fact. When you do this:

*(0..50)

you get an error.

The splat operator, in this case, requires a receiver in order to work. So don't fool yourself into thinking its broken in irb by just trying it without a receiver.

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