2016-03-30 89 views
0

我有一個字符串:枚舉更改爲不同類

bottom_line = "some text" 

當我從它創建一個枚舉與enum_for,並嘗試調用它each,我得到一個錯誤:

z = bottom_line.enum_for 
z.each {|item| item.scan(/some_regex/)} 
# => undefined method `each' for #<String:0x00000001f65350> 

這裏發生了什麼?

當我在同一個線連鎖enum_for該方法,它的工作原理:

z = bottom_line.enum_for(:scan, /some_regex/) 
+0

感謝您的明確的解釋卡里 - 我曾試圖尋找以前的文件但看看枚舉的文檔,我沒」 t實現它將#each方法傳遞給底層對象的類,在這種情況下,String爲 –

回答

0

z.each使方法Enumerator#each被髮送到zEnumerator#each獲得enum_for的接收方(bottom_line)的類別,即String。然後它會調用方法String#each。它在String類中找不到這種實例方法,因此會引發您獲得的異常。

2

您可能希望在提問前查看Object#enum_for的文檔。

Object#enum_for接受1+個參數:實際調用枚舉時要調用的方法(默認爲:each)以及要傳遞給該方法的splatted參數。

這就是說,

​​

是絕對等同於:

z = bottom_line.enum_for(:each) 

而內嵌的版本是

z = bottom_line.enum_for(:scan) 

爲什麼你會期望他們的行爲以同樣的方式?爲了實現相同的功能一個可以明確指定呼叫的方法enum_for

z = bottom_line.enum_for :scan 
z.each(/some_regexp/) { |item| puts item } 
+0

upvoted *在查詢*註釋之前查看文檔 – joanbm