2009-05-29 58 views
27

Trong Ruby Programming Language, Chương 6 (đoạn thứ hai) họ nêu:chức năng của Ruby vs phương pháp

Nhiều ngôn ngữ phân biệt giữa chức năng, mà không có đối tượng liên quan , và phương pháp, mà được gọi trên một máy thu vật. Bởi vì Ruby là một ngôn ngữ hướng đối tượng thuần túy, tất cả các phương thức là các phương thức đúng và là được liên kết với ít nhất một đối tượng.

Và sau đó ở giữa của đoạn 6:

Cả hai procs và lambdas là chức năng chứ không phải là phương pháp gọi trên một đối tượng .

Tôi hơi bối rối về những phát biểu này. Ruby thực sự là OO thuần túy, và do đó không có các hàm không liên kết với các đối tượng (nếu đó là định nghĩa hợp lệ của OO thuần túy), hoặc là các procs/lambdas được liên kết với đối tượng Proc? Sự khác nhau giữa các hàm và phương thức trong Ruby là gì?

Bất kỳ trợ giúp nào trong phân tích cú pháp và hiểu điều này sẽ được đánh giá cao.

Trả lời

21

lambda s trong Ruby là đối tượng của lớp Proc. Proc đối tượng không thuộc về bất kỳ đối tượng nào. Chúng được gọi mà không ràng buộc chúng với một đối tượng.

Phương thức là đối tượng của một trong hai lớp Method hoặc UnboundMethod, tùy thuộc vào việc chúng có bị ràng buộc hoặc không bị ràng buộc hay không. Xem phần giải thích here. Không thể gọi các phương thức chưa được gửi cho đến khi chúng được liên kết với một đối tượng.

lambda{|x| x}.class  # => Proc 
lambda{|x| x}.call(123) # => 123 

class Foo 
    def bar(baz) 
    baz 
    end 
end 

puts Foo.new.method(:bar).class  # => Method 
puts Foo.new.method(:bar).call(123) # => 123 

puts Foo.instance_method(:bar).class  # => UnboundMethod 
puts Foo.instance_method(:bar).call(123) # => throws an exception 

Bạn có thể bind một UnboundMethod đến một đối tượng và sau đó gọi nó. Nhưng bạn không thể bind một Proc cho một đối tượng nào cả. Tuy nhiên, đối tượng Proc có thể nắm bắt các biến cục bộ trong phạm vi xung quanh, trở thành bao đóng.

5

Procs và lambdas là cả hai đối tượng cho chính mình, với phương thức call thực sự gọi khối liên kết với proc (hoặc lambda). Tuy nhiên, Ruby cung cấp một số cú pháp đường để gọi chúng mà không có lệnh gọi rõ ràng tới call.

+0

Có, proc và lambda là cả hai đối tượng Proc, nhưng chúng có ý nghĩa gì bởi "là các hàm chứ không phải là phương thức". Và sự khác biệt là gì? –

+0

Ông có nghĩa là câu ở giữa đoạn thứ 6 là không chính xác. –

+1

Sự khác biệt thực sự là, hầu như phổ biến, procs và lambdas chỉ được sử dụng cho phương pháp 'gọi' liên quan của họ. Không ai lưu trữ các phương thức hoặc giá trị bổ sung với chúng. Vì vậy, như Kaptajn Kold nói, chúng ta có thể sử dụng chúng như chúng ta sẽ sử dụng các hàm thứ tự đầu tiên trong các ngôn ngữ khác, mặc dù chúng vẫn thực sự là các đối tượng. – rampion

5

Tôi nghĩ rằng sự khác biệt giữa các phương pháp và first order function tức là. các hàm có thể được truyền xung quanh dưới dạng giá trị.

Các vấn đề liên quan