2016-08-19 24 views
3

在Ruby中,下面的表達式: x.filter {|n| n.even?} 也可以寫爲: x.filter(&:even?) 所以,我想知道我怎麼會寫這樣的表達? x.filter {|n| !n.even?} 而不使用odd?方法Ruby:取消散列傳遞給proc?

+1

proc本質上被稱爲to_proc對象。你的否定是在對象上的,所以除非你把它作爲一個proc來存儲,否則你不能稱它。雖然如果這是實際的代碼,那爲什麼不用x.filter(&:odd?)? – Sam

+1

'even?'是一個在給定對象上調用的方法,它是'Symbol#to_proc'的工作方式,因爲'!'(不)被繞過返回值到'BasicObject#!'。所以你不能用這種方式寫。你可以添加一個'not_even?'方法,但這隻意味着'奇怪',那麼爲什麼不使用'odd?'。如果'x'是可枚舉的(包括'Enumerable'),那麼你可以做'_,not_even = x.partition(&:even?)',但我不認爲這就是你想要的。 – engineersmnky

+1

只是想指出,你總是有'過濾器'''選擇''拒絕'對應。看看[這個答案](http://stackoverflow.com/a/23711606/2981429),它顯示了一些符號到程序的hackery。但是,如果其他人將閱讀代碼,可能最好避免這些技巧。 –

回答

3

如薩姆和engineerskmnky在下面討論的評論說,這是不可能直接執行x.filter { |n| !n.even? }操作(並且事實上該塊內的兩個操作)。

我想這只是一個簡單的例子,而不是一個真實的代碼,所以如果你有沒有相反的方法,你不想創建一個,你可以在下面創建一個lambda或proc方法:

not_even = -> (n) { !n.even? } 

然後調用它的過濾器:

x.filter(&not_even) 

您還可以使用reject方法,它應該給你同樣的結果,而無需使用拉姆達的魔力。

+0

沒錯。很多像'filter'這樣的Ruby方法都有它們的否定對象,例如'reject'。 – tadman

+0

謝謝。拒絕聽起來像是一個很好的選擇 –

相關問題