2013-02-26 5 views
3

я могу использовать тройной оператор, как это:Ruby: Получить значение, если оно истинно или

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

Как-то использование временных переменных не является опцией? – nicooga

+0

Я бы просто проверил на пустое место? после фильтра. –

ответ

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 
Смежные вопросы