2014-04-01 94 views
2

可以說我有一個數組鏈接塊傳遞紅寶石

array = [[2], [1], [0]] 

我可以這樣做:

array.map(&:any?) 
# => [true, true, true] 

,我可以這樣做:

array.map do |x| 
    x.any?(&:zero?) 
end 
# => [false, false, true] 

爲什麼不能我做這個? (或類似的東西):

array.map(&:any?(&:zero?)) 

回報語法錯誤:意外 '(',預計 ')'

array.map(&:任何(&:零)?)

謝謝爲你的時間。

+0

你爲什麼要定義'array',然後使用'了'未被定義? – sawa

+0

@sawa,哎呀,謝謝,將解決(問題和答案以下所有仍然是一樣的和所有) – user2251284

回答

3

因爲:any?(&:zero?)是不恰當的符號文字。您可以通過執行:"any?(&:zero?)"來使其成爲符號,但仍然沒有這種方法。

+0

好的,所以,我可以做proc = Proc.new {| v | v.any?(&:zero?)}然後array.map(&proc),爲什麼不像array.map(&(any?(&:zero?))。to_proc) ?儘管謝謝你的回答,但這非常有趣,並且搜索功能並沒有多大幫助。 – user2251284

+0

'any?(&:zero?)'表示'self.any?(&:zero?)'。爲了實現這一點,'self'必須是對'any?'作出響應的東西,其結果必須是對'to_proc'做出響應的東西。 – sawa

2

爲什麼?簡單的答案:因爲Ruby不包含它的語法。

您基本上正在嘗試將默認參數傳遞給該方法。 Ruby的開發者,在某些時候,做了一個決定,像這樣的特點是太多的工作和額外的複雜的東西可以用這個小的代碼來實現:

array.map {|e| x.any?(&:zero?)} 
+0

其實,他試圖使用符號文字與括號,這是不是一個有效的語法。這是語法錯誤的原因。 –

+0

@GuilhermeFranco:這是語法錯誤的原因,是真的,但這並不意味着有做OP的要求做的語法。從Q:'爲什麼我不能這樣做? (或類似的東西):' – Linuxios

+0

我認爲他不能這樣做,因爲它是一個無效的語法= P –

3

原因在其他答案中解釋。但是,您可以使用任何快捷鍵,如果你定義一個進程:

any_zeros= ->(o) { o.any?(&:zero?) } 
array = [[2], [1], [0]].map(&any_zeros) 
+1

正如您使用'lambda'方法,變量名稱應該是'lambda'而不是'proc'。 :-) –

+1

變量名稱既不應該是「proc」或「lambda」,它應該是助記符的:類似'any_zeros?'將它命名爲描述它正在做什麼的東西,即使是像這樣的臨時事物。 –

+0

好點,更正。 – BroiSatse