2017-12-27 146 views
1

對於數組中的元素迴應,我可以做紅寶石適用看跌數組

[1,2,3].each(&:to_s) 

方法,但對於:

[1,2,3].each {|i| puts i} 

我不能這樣做:

[1,2,3].each(&:puts) 

如何優雅地將Kernel方法(如puts)應用於數組中的對象?會不會有Rubyish的方式?

+10

你的最後一個例子對我來說似乎很紅寶石...... – maerics

+4

'puts [1,2,3]'? –

回答

4

puts是一種方法,在定義Kernel將其轉換爲proc,使用:

[1,2,3].each(&method(:puts)) 

Symbol#to_proc有特定的含義,基本上本身發送到接收器。

有人可能的任何方法轉化爲proc通過它來阻止:

%w[1 2 3].map(&method(:Integer)) 
#⇒ [1, 2, 3] 
+0

謝謝。正是我在找什麼。現在,我只需要等10分鐘,然後SO就可以將其標記爲「答案」 –

+0

爲了讓其他人更好地瞭解這個問題,在這種情況下,前導'&'是通過對象的參數將參數轉換爲塊'to_proc'方法。例如'&:to_s'(問題是'Symbol#to_proc')和'&method(:puts)'(如答案中)是'Method#to_proc'。對於'Symbol#to_proc',將'Symbol'發送到block參數,其中'Method#to_proc'將block參數發送給'Method' – engineersmnky

+3

這很整潔,除了我認爲OP的最後一個例子更具慣用性,更多重要的是,比這些例子更容易理解...... – maerics

5

你的最後一個例子是慣用的紅寶石:

[1,2,3].each { |x| puts x } 

當然,還有其他方法可以做到同樣的事情,但上面的代碼很簡單,任何Rubyist都很容易理解。

+0

這永遠不會通過我的CR。 Ruby被髮明是語法加糖的,它應該具有糖語言的使用能力。 – mudasobwa

+2

@mudasobwa我想我們在這裏有不同的看法 - 對我來說,簡單和清晰比糖更重要。 – maerics

+1

從來不是一個強大的詞。國際海事組織,編程中很少有東西應該使用從不或永遠的話。我必須同意@maerics這個。代碼是寫的,是的;但最終,代碼是要讀取的。它是由你未來的自己和下一個必須維護你的代碼的人閱讀的。 –