尽管星号(
星号在赋值(
*
)结构通常被称为星号操作符,但很明显,与否定(!
)操作符等其他一元操作符相比,它是一种不同的存在。星号在赋值(
=
)时可以正常使用(即未包含在括号中),但在条件赋值(||=
)中使用时会产生错误。例如:a = *(1..3)
#=> [1, 2, 3]
b ||= *(1..3)
SyntaxError: (irb):65: syntax error, unexpected *
我不是在寻找做同一件事情的替代方法,而是在寻找一个对Ruby内部机制有更好理解的人来解释为什么第一个案例中使用扩展符构造可以工作,而第二个案例中却不能。
a = *(1..3)
实际上被解析为a =* (1..3)
,因此=*
有点像一个运算符,而||=*
则会被处理成一个不同的不存在的运算符。 - amoebea =* a || (1..3)
可以工作。 - Petr Skocik*a = (1..3)
将会改变a
的值为[1,2,3]
即使它在左边。然而*a ||= 1..3
仍然不起作用。 - fylooi||=
确实可以避免名称错误和其他有趣的事情。其他有趣的事情。 - amoebe