Ruby:如果为真则获取值

3
我可以像这样使用三元运算符:

我可以像这样使用三元运算符:

a.empty? ? a : b

如果a只是一个短变量,这个方法可以使用。如果我不想使用变量,而是在一个复杂的数组函数链中,我没有临时变量,如何避免重复链?在我的看法中,这似乎只适用于空值,我可以使用or来实现。

a.filter { bla bla bla }.map { bla bla bla }.reduce { bla bla } || b

但对于其他任何检查,如何做到这一点呢?

a.filter { bla bla bla }.map { bla bla bla }.reduce { bla bla }.empty? ? a.filter { bla bla bla }.map { bla bla bla }.reduce { bla bla } : b

1
一个问题与第一行。如果a是empty,为什么你还想要再次执行它?我想问,我的想法是否正确:“如果 filter -> map -> reduce 给出了空结果,难道你还想再次运行它吗?” - Arindam
1
临时变量不是一个选项吗? - ichigolas
在过滤后,我只会检查是否为空? - Andrew Kirkegaard
3个回答

4

这个问题已经被反复提出:

a
.filter{bla bla bla}
.map{bla bla bla}
.reduce{bla bla}
.tap{|a| break a.empty? ? a : b}

或者,作为替代方案(不建议这样做):
a
.filter{bla bla bla}
.map{bla bla bla}
.reduce{bla bla}
.instance_eval{empty? ? self : b}

2
您可以将第一部分的值赋给一个变量,然后在第二部分中使用它:
(temp = a.filter { bla bla bla }.map { bla bla bla }.reduce { bla bla }).empty? ? b : temp

1
使用(或复制)presence,这是active_support专门为此定义的内容:
a.filter{ bla bla bla }
 .map { bla bla bla }
 .reduce{ bla bla }
 .presence || b

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