2012-02-27 25 views

回答

7

不,沒有簡寫。你可以定義一個方法:

def really_empty?(x) 
    x.strip.empty? 
end 

,並使用method

array.reject(&method(:really_empty?)) 

或使用lambda:

really_empty = ->(x) { x.strip.empty? } 
array.reject(&really_empty) 

,但我不會把那些要麼更好,除非你有一個在足夠的地方使用really_empty?來分解邏輯是有意義的。

不過,既然您使用Rails,你可以只使用blank?代替.strip.empty?

array.reject(&:blank?) 

注意nil.blank?是真實的,而nil.strip.empty?只是給了你一個例外,所以他們不太同等學歷;然而,你可能想要拒絕nil s,所以使用blank?可能會更好。 blank?對於false,{}[]也會返回true,但您可能沒有那些字符串數組。

+1

你也可以定義really_empty?方法放在「數組內容類」(例如String)上,然後像空白方法一樣使用它。我不建議這個,只是說你可以.. – Johannes 2015-12-14 09:59:35

2

這將是相當不錯的寫上面這樣的,但它不是一個支持的語法,你會使用to_proc語法想鏈方法的方式(& :)就像這樣:

.map(&:strip).reject(&:empty?)

+1

儘管在所有的現實,而不是試圖鏈在一起那樣,我會選擇使用你原來的例子,因爲它是。 – 2012-02-27 05:05:54

+2

我剛剛進行了一次快速測試,結果發現以原來的方式做它的速度比在我的系統上快兩倍(這是有道理的,因爲另一個臨時數組必須作爲部分進行分配)的地圖)。 – 2012-02-27 05:15:42

+0

在map之前調用'lazy'可能有助於提升性能。 – michau 2016-08-26 15:20:28

1

您可以用ampex寶石做:

require 'ampex' 
array.reject &X.strip.empty?