首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在哪里使用ruby splat操作符是合法的?

在哪里使用ruby splat操作符是合法的?
EN

Stack Overflow用户
提问于 2009-04-22 09:58:23
回答 1查看 9.9K关注 0票数 18

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可以出现在表达式中的什么位置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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方法,它有三个参数:

代码语言:javascript
复制
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)。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/776462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档