Ruby中类似于Groovy的Elvis(?:)运算符是什么?

43

我知道我可以不用它生活,但这个问题一直困扰着我。

是否有与Groovy的Elvis operator (?:)等效的Ruby习语?

本质上,我想能够缩短这个:

PARAM = ARGV[0] ? ARGV[0] : 'default'

或者等价地

PARAM = 'default' unless PARAM = ARGV[0]

变成这样

PARAM = ARGV[0] ?: 'default'

1
可能是什么意思?的重复问题。 - Andrew Grimm
8
只有当你已经知道答案时才是这样的。:p - Igor
3个回答

64

没事了 :-) 我在找到运算符的名称后自己找到了答案。

来自这里:

PARAM = ARGV[0] || 'default'

可能是因为我现在正在同时学习四种语言,所以我忘记了一开始就可以这样做。


4
如果你像这样做 @params = @params || 5,你可以简化为 @params ||= 5 - Ryan Bigg
3
若要严格解释,它更像是 @params || @params = 5 - Andrew Grimm
11
这不完全正确。Kotlin的?:和C#的??检查NULL值。Ruby的||检查真实性。如果你正在使用布尔值,比如 foo = bar || true 并且你期望只有当barnil时才将true作为默认值,那么它是行不通的。如果bar不是nil但为false,它仍将默认为true - Adeynack

12
自 Ruby 2.3 版本以来就可以实现此功能。
dog&.owner&.phone

1
它解决了一个不同的问题,但是这可以避免nulltrue之间的困境:nil.class # => NilClassnil&.class # => nil(不是NilClass!)false.class #=> FalseClassfalse&.class #=> FalseClass - Alistair A. Israel

4
“PARAM = ARGV[0] ? ARGV[0] : 'default'”和“PARAM = (ARGV[0] || 'default')”不是一样的吗?

请查看此评论。它并不完全相同。 - Adeynack
1
@Adeynack,看起来@Hock提到的两种语法都会根据ARGV[0]的真实性进行分支。如果我错了,你能解释一下哪个不会以及为什么吗? - JakeRobb
1
@JakeRobb,你说得完全正确,我现在想知道为什么3年前我会写那个。感谢你澄清了我引入的混乱! - Adeynack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接