[英]What is the difference between a method and a proc object?
我知道 Ruby 中的方法不是對象,而是 procs 和 lambdas。 除此之外,它們之間還有什么區別嗎? 因為我們都可以繞過。 是什么使 proc 對象與方法不同?
方法:
1.8.7-p334 :017 > def a_method(a,b)
1.8.7-p334 :018?> puts "a method with args: #{a}, #{b}"
1.8.7-p334 :019?> end
1.8.7-p334 :021 > meth_ref = Object.method("a_method")
=> #<Method: Class(Object)#a_method>
1.8.7-p334 :022 > meth_ref.call(2,3)
過程對象:
a = lambda {|a, b| puts "#{a}, #{b}"}
a.call(2,3)
簡單來說:
Method
對象被“綁定”到一個對象,這樣當你call
該方法時self
指向該對象,而Proc
沒有這種行為; self
取決於創建/調用Proc
的上下文。
然而:
你在你的問題中說“方法不是對象”,但你必須小心區分“方法”和Method
。
“方法”是一組已定義的表達式,它被賦予一個名稱並放入特定類的方法表中,以便以后輕松查找和執行:
class Foo
def my_method
return 123
end
end
Foo.new.my_method
# => 123
Method
對象(或類似的UnboundMethod
對象)是通過調用method
/ instance_method
/ 等創建的實際 Ruby 對象,並將“方法”的名稱作為參數傳遞:
my_Foo = Foo.new
my_Method = my_Foo.method(:my_method)
# => #<Method: Foo#my_method>
my_Method.call
# => 123
my_UnboundMethod = Foo.instance_method(:my_method)
# => #<UnboundMethod: Foo#my_method>
my_UnboundMethod.bind(my_Foo).call
# => 123
Proc
對象是一組沒有給定名稱的表達式,您可以將其存儲以供以后執行:
my_proc = Proc.new { 123 }
my_proc.call
# => 123
您可能會發現閱讀有關UnboundMethod
、 Method
和Proc
的 RDoc 文檔很有用。 RDoc 頁面列出了每種類型可用的不同實例方法。
塊和過程之間的差異
procs 和 lambdas 之間的差異
return
關鍵字這里解釋得很好(我只是從下面的鏈接中復制了它)
http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/
我知道Ruby中的方法不是對象,而proc和lambda是對象。 除此以外,它們之間還有其他區別嗎? 因為我們都可以繞過去。 是什么使proc對象與方法不同?
方法:
1.8.7-p334 :017 > def a_method(a,b)
1.8.7-p334 :018?> puts "a method with args: #{a}, #{b}"
1.8.7-p334 :019?> end
1.8.7-p334 :021 > meth_ref = Object.method("a_method")
=> #<Method: Class(Object)#a_method>
1.8.7-p334 :022 > meth_ref.call(2,3)
處理對象:
a = lambda {|a, b| puts "#{a}, #{b}"}
a.call(2,3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.