2013-02-26 115 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