18

Splats 很酷。它们不仅仅用于爆炸数组,尽管这很有趣。它们还可以转换为 Array 和展平数组(请参阅http://github.com/mischa/splat/tree/master了解它们所做的详尽列表。)

看起来无法对 splat 执行额外的操作,但在 1.8.6/1.9 中,以下代码会抛出“unexpected tSTAR”:

foo = bar || *zap #=> unexpected tSTAR

而这有效:

foo = *zap || bar #=> works, but of limited value

splat 可以出现在表达式中的什么位置?

4

2 回答 2

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

foo(*bar = [1, 2, 3])将在赋值后 splat 并将参数分别设置为 1、2 和 3。比较foo((*bar = [1, 2, 3]))which 会抱怨参数数量错误(1 比 3)。

于 2009-04-22T14:46:21.067 回答
9

“splat 运算符”实际上根本不是运算符,而是 Ruby 语法中定义的标记。通读 Grammar.y 或 BNF 形式* 的 Ruby 语法会告诉你它被允许作为最后一个或唯一的参数:

  • 在方法定义中(除了可选的 last &foo
  • 在方法调用中(除了可选的 last &foo
  • 在 as assignment 的 LHS 上,例如:a, b, *cs = [1,2,3,4]
  • 在作业的 RHS 上,例如:a, b, c = 1, 2, *[3,4,5]
  • 在 case 语句的 when 子句中
于 2011-04-08T18:04:02.497 回答