2013-02-26 78 views
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是'空',为什么你想要再次执行?我错在想:“如果filter-> map - > reduce给你一个空的结果,你想再次运行它,为什么?” – Arindam 2013-02-26 19:09:19

+1

不知何故使用临时变量不是一个选项? – nicooga 2013-02-26 19:09:50

+0

我只是检查空的?过滤后。 – 2013-02-26 19:11:55

回答

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

使用(或复制)presenceactive_support精确地定义为这样的:

于第一线
a.filter{ bla bla bla } 
.map { bla bla bla } 
.reduce{ bla bla } 
.presence || b