2012-11-13 61 views
3

正如我們所知,wo可以通過前綴&:將方法傳遞給迭代器方法。
例如:將方法傳遞給迭代器方法時發生了什麼

["a", "b"].map(&:upcase) #=> ["A", "B"] 
def rettwo 
    2 
end 
["a", "b"].map(&:rettwo) #=> [2, 2] 

這是問題所在,當我寫的方法,通過一種方法與&:前綴給它,我有一個錯誤消息:「引發ArgumentError:沒有給定接收器」。
讓我告訴代碼:

def a_simple_method &proc 
    puts proc.class # it shows `Proc` 
    proc.call 
end 
def a_iterator_method 
    puts yield 
end 

a_simple_method &:rettwo #=> ArgumentError: no receiver given 
a_iterator_method &:rettwo #=> ArgumentError: no receiver given 

我缺少的是什麼,怎麼樣map陣列的方法處理它

+0

什麼是'rettwo'? – Phrogz

+0

@Phrogz:它在開始:) –

+1

@Phrogz從我們可以看到的,我會說這是一個簡單的方法返回2(ret-urn two) –

回答

4

這裏是什麼工作。下面的解釋。

class String 
    def rettwo 
    self + self 
    end 
end 

def a_simple_method &proc 
    proc.call('a') 
end 

def a_iterator_method 
    yield 'b' 
end 

a_simple_method(&:rettwo) # => "aa" 
a_iterator_method(&:rettwo) # => "bb" 

&:結構被稱爲Symbol#to_proc。它把符號變成了一個proc。這個過程需要一個接收器作爲第一個參數。剩下的參數用於調用proc。你沒有傳遞任何參數,因此「接收器沒有給出」的錯誤。

這裏的附加參數示範:

class String 
    def say name 
    "#{self} #{name}" 
    end 
end 

def a_simple_method &proc 
    proc.call('hello', 'ruby') 
end 


a_simple_method(&:say) # => "hello ruby" 

下面是從2008年現代標誌#to_proc一些博客文章符號#to_proc的定義似乎在C中實現,但是這仍然可以幫助理解。

class Symbol 
    def to_proc 
    Proc.new { |*args| args.shift.__send__(self, *args) } 
    end 
end 
+0

Thx爲您的答案:) –

+0

而且我得到一些其他消息另外:在任何類之外定義的每個方法都將成爲每個類的私有方法,這解釋了爲什麼'[「a」,「b」]。map(&:rettwo)'工作:在地圖內部,它執行處理。 call(元素)和'rettwo'確實成爲其元素的私有方法 –

相關問題