Dav*_*lan 18 ruby arrays syntax operator-precedence splat
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在哪里可以出现在表达式中?
Pes*_*sto 15
首先,优先权不是问题,因为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
Run Code Online (Sandbox Code Playgroud)
foo(*bar = [1, 2, 3])将在赋值后进行splat,并将参数分别设置为1,2和3.比较那些foo((*bar = [1, 2, 3]))会抱怨错误数量的参数(1为3).
"splat运算符"实际上根本不是运算符,而是Ruby语法中定义的标记.通读grammar.y或BNF形式的Ruby语法*将告诉您允许它作为最后或唯一的参数:
&foo)&foo)a, b, *cs = [1,2,3,4]a, b, c = 1, 2, *[3,4,5]