簡體   English   中英

方法和 proc 對象有什么區別?

[英]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

您可能會發現閱讀有關UnboundMethodMethodProc的 RDoc 文檔很有用。 RDoc 頁面列出了每種類型可用的不同實例方法。

塊和過程之間的差異

  1. 過程是對象,塊不是
  2. 一個參數列表中最多可以出現一個塊

procs 和 lambdas 之間的差異

  1. Lambdas 檢查參數的數量,而 procs 不檢查
  2. Lambdas 和 procs 以不同的方式對待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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM