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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

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

提问于
用户回答回答于

首先,优先权在这里不是问题,因为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)。如果这不能涵盖你的情况,你应该问自己,你真正希望通过编写这样一个丑陋的构造来完成什么。

用户回答回答于

实际上,“splat运算符”不是一个运算符,而是Ruby语法中定义的一个token。

阅读grammar.y或BNF格式的Ruby语法

会告诉你它可以作为最后或唯一的参数:

  • 在方法定义中(除了可选的最后一个&foo
  • 在方法调用中(除了可选的最后一个&foo
  • 作为分配的LHS,例如: a, b, *cs = [1,2,3,4]
  • 在任务的RHS上,例如: a, b, c = 1, 2, *[3,4,5]
  • 在case语句的when子句中

扫码关注云+社区