【发布时间】:2015-04-25 11:26:07
【问题描述】:
虽然 splat (*) 构造通常被称为 splat 运算符,但与其他一元运算符(如否定 (!) 相比,它显然是一个不同的野兽) 运算符。
在赋值 (=) 中使用时,splat 本身可以正常工作(即不包含在括号中),但在与条件赋值 (||=) 一起使用时会产生错误。示例:
a = *(1..3)
#=> [1, 2, 3]
b ||= *(1..3)
SyntaxError: (irb):65: syntax error, unexpected *
我不是在寻找做同样事情的替代方法,而是寻找对 Ruby 内部结构有更好理解的人来解释为什么 splat 构造的这种用法在第一种情况下有效,而在第二种情况下无效。
【问题讨论】:
-
我猜这只是 ruby 解析器的一个缺陷。
-
我最好的猜测是
a = *(1..3)实际上被解析得更像a =* (1..3),所以=*有点像一个运算符,而||=*会被当作一个不同的不存在的运算符来处理。 -
@amoebe 确实!明确的
a =* a || (1..3)有效。 -
关于 splat 的有趣之处 -
*a = (1..3)也会将a的值更改为[1,2,3],即使它位于左侧。*a ||= 1..3仍然不起作用。 -
@PSkocik 但请记住,
||=在变量未定义和other funny stuff 时确实避免了名称错误。
标签: ruby