2013-03-13 24 views
0

Array#reject!回報nil的情況下,該塊計算爲false對於接收機中的每一個元素(這是在地方改變,在這種情況下不發生變化),相較於Array#reject當沒有變化時`Array#reject!`返回`nil`的目的是什麼?

a=1,2,3 
a.reject {false} # => [1, 2, 3] 
a.reject! {false} # => nil 

這在我看來,相當奇怪。爲什麼Array#reject!被設計爲這樣做?在這種情況下,Array#reject!應該像Array#reject一樣嗎?

我希望能夠鏈接方法,如select!,reject!map!。有沒有辦法做到這一點?

+3

_delete to #delete_if,從自身刪除塊的計算結果爲true的元素,但如果沒有更改,則返回nil。 – 2013-03-13 02:39:55

+0

@MichaelBerkowski當然它確實如此,我不問**如果它確實**,我問**爲什麼** – 2013-03-13 02:47:10

+3

@Drukagagar因爲它是這樣設計的。試圖猜測/證明理性通常不是建設性的。也許ML上有一篇關於*設計選擇*的舊文章。無論如何,它不是「破碎」的。 – 2013-03-13 02:47:43

回答

3

使用delete_if代替?其餘的東西很好鏈接。


reject作品像select,它實際上返回一個新的容器,因爲你問那麼就指向新的!,反之,delete_if做到位,直接。

我同意這是不自然的,但什麼都有可能發生很多,是你寫的:

value = a.reject!; if value, do {something} end 

所以有點是有道理的,它返回null,因爲那時如果沒有拒絕,什麼都不需要做。如果您希望改變某些內容,那麼您只需使用select!

+0

謝謝@Kasumi,你應該考慮將你的評論添加到你的答案中。 – 2013-03-13 03:04:55

0

我覺得reject!旨在返回nil時不進行改變,所以它可以很好地使用這樣的:當沒有拒絕

candidates.reject! { |c| ... } or puts "Unable to reject any candidates." 

由於reject!返回nil,部分經過「或」只有在沒有拒絕的情況下才會運行。

你也可以做一些像Kasumi的回答。

相關問題