Splats很酷。它们不仅仅是用来分解数组的,尽管这很有趣。它们还可以转换为数组和扁平化数组(有关它们所做工作的详尽列表,请参阅http://github.com/mischa/splat/tree/master )。
看起来不能在splat上执行额外的操作,但在1.8.6/1.9中,以下代码抛出了“意外的tSTAR":
foo = bar || *zap #=> unexpected tSTAR
鉴于这是可行的:
foo = *zap || bar #=> works, but of limited value
splat可以出现在表达式中的什么位置?
发布于 2009-04-22 14:46:21
首先,优先级在这里不是问题,因为foo = bar || (*zap)
也不能更好地工作。一般的经验法则是,您不能在splat上执行其他操作。即使像foo = (*zap)
这样简单的东西也是无效的。这也适用于1.9。
话虽如此,你希望foo = bar || *zap
做什么,如果它工作了,这与foo = bar || zap
不同吗?即使在像a, b = bar || *zap
这样的情况下(也不能工作),a, b = bar || zap
也完成了我认为应该是一样的事情。
唯一有意义的情况是像a, b = foo, bar || *zap
这样的东西。您应该会发现,a, b = foo, *(bar || zap)
涵盖了您想要使用它的大多数情况。如果这还不能涵盖您的情况,您可能应该问问自己,您真正希望通过编写这样一个丑陋的构造来实现什么。
编辑:
为了回应你的评论,*zap || bar
等同于*(zap || bar)
。这说明了splat的优先级有多低。它到底有多低?我能给你的最好的回答是“相当低”。
不过,举个有趣的例子,考虑一个foo
方法,它有三个参数:
def foo(a, b, c)
#important stuff happens here!
end
foo(*bar = [1, 2, 3])
将在赋值后分裂,并将参数分别设置为1、2和3。这与foo((*bar = [1, 2, 3]))
相比,它会抱怨参数的数量错误(1比3)。
https://stackoverflow.com/questions/776462
复制相似问题