gpt4 book ai didi

ruby - 在哪里使用 ruby​​ splat 运算符是合法的?

转载 作者:数据小太阳 更新时间:2023-10-29 06:33:24 34 4
gpt4 key购买 nike

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

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

foo = bar || *zap #=> 意外的 tSTAR

虽然这是可行的:

foo = *zap || bar #=> 有效,但值(value)有限

splat 可以出现在表达式中的什么地方?

最佳答案

首先,优先级在这里不是问题,因为 foo = bar || (*zap) 也没有更好的效果。一般的经验法则是您不能对 splat 执行其他操作。即使像 foo = (*zap) 这样简单的东西也是无效的。这也适用于 1.9。

话虽如此,你期待什么 foo = bar || *zap 做,如果它有效,那就不同于 foo = bar ||击打?即使在像 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]) 将在赋值后弹出并将参数分别设置为 1、2 和 3。将其与 foo((*bar = [1, 2, 3])) 进行比较,后者会提示参数数量错误(1 对 3)。

关于ruby - 在哪里使用 ruby​​ splat 运算符是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776462/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com