使用ruby splat运算符在哪里合法?

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).

  • 该示例仅供说明之用。许多年前,我已经实现了生活中想要的一切,现在我只是喜欢探索 Ruby 的深度。不是吗?:) (2认同)

Rei*_*chs 8

"splat运算符"实际上根本不是运算符,而是Ruby语法中定义的标记.通读grammar.y或BNF形式的Ruby语法*将告诉您允许它作为最后或唯一的参数:

  • 在方法定义中(可选的最后一个除外&foo)
  • 在方法调用中(可选的最后一个除外&foo)
  • 在作为任务的LHS上,例如: a, b, *cs = [1,2,3,4]
  • 关于任务的RHS,例如: a, b, c = 1, 2, *[3,4,5]
  • 在案例陈述的when子句中