【问题标题】:What does a * in front of a string literal do in ruby?ruby 中字符串文字前面的 * 有什么作用?
【发布时间】:2011-05-01 04:11:34
【问题描述】:

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

[*"a".."z"]

【问题讨论】:

  • 在这种情况下,它不在字符串文字前面,而是在 Range 前面。

标签: ruby splat


【解决方案1】:

它叫splat operator

喷左值

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

*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

空溅

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

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

喷出右值

当一个 rvalue 被 splatted 时,它会使用 Kernel.Array() 转换为一个 Array,其中的元素本身就成为 rvalues。

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

【讨论】:

  • 除了赋值之外,您还可以在定义方法时使用 splat 运算符:def do_it(arg1, *args)。现在您可以致电do_it(1, 2)do_it(1, 2, 3, 4)
【解决方案2】:

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

【讨论】:

  • 在某些情况下*,这是真的。 :)
【解决方案3】:

嗯,有趣的事实。当你这样做时:

*(0..50)

你得到一个错误。

在这种情况下,splat 运算符需要接收器才能工作。所以不要在没有接收器的情况下尝试它,从而欺骗自己认为它在 irb 中坏了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 2021-12-16
    • 2011-06-14
    • 2015-06-16
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多