2009-11-06 31 views
19

Tôi đã xem phiên bản Ruby mới nhất, để phát một chút với những thay đổi mới nhất. Điều đầu tiên tôi cố gắng làm là gọi một lambda/block/proc của Ruby giống như bạn làm với một Python có thể gọi được.Tại sao cuộc gọi lambda Ruby 1.9 có thể không có dấu chấm ở trước dấu ngoặc đơn?

a = lambda {|x| puts x} 
a.call(4) # works, and prints 4 
a[4] # works and prints 4 
a.(4) # same 
a(4) # undefined method 'a' for main:Object 

Tại sao cuộc gọi cuối cùng không thể thực hiện được? Nó sẽ bao giờ?

Trả lời

10

AFAIK đó là vì ruby ​​không cho phép bạn xác định phương thức () cho một đối tượng. Lý do nó không cho phép bạn xác định phương thức () có lẽ là do thực tế là dấu ngoặc đơn là tùy chọn trong các cuộc gọi phương thức.

Và đối với những gì nó có giá trị, đây là một hack để cho phép bạn gọi lambdas sử dụng ()http://github.com/coderrr/parenthesis_hacks/blob/master/lib/lambda.rb

+0

bạn có thể giải thích kịch bản lambda một chút không? – Geo

+0

ok, khi bạn cố gắng gọi một phương thức có tên 'blah()' và 'method_missing' được kích hoạt, nó sẽ kiểm tra xem liệu lambda có được gọi là' blah' được định nghĩa trong ngữ cảnh thích hợp hay không. Nếu một lambda như vậy được định nghĩa thì nó chỉ gọi lambda bằng cách sử dụng cú pháp 'blah.call' thông thường, nó cũng truyền theo bất kỳ tham số nào đã được đưa ra – horseyguy

+0

Tôi nghĩ rằng đây là một hack tuyệt vời. Cảm ơn bạn. – Geo

6

Ruby về cơ bản là 100% hướng đối tượng, nhưng đôi khi nó cố che giấu thực tế này để ... tiện lợi? Quen thuộc?

Các chức năng cơ bản được xác định "ở cấp cao nhất" thực sự được định nghĩa là các phương thức trên đối tượng chung. Để làm cho công việc đó, một cuộc gọi mà không có một specifier thực sự được chuyển đổi để gọi một phương thức với tên đó trên đối tượng toàn cầu đã nói. Phong cách này làm cho mọi thứ trông kịch bản hơn-y. Ruby đang cố gắng làm điều đó với ví dụ cuối cùng của bạn.

Hai ví dụ đầu tiên phân tích cú pháp tốt vì Ruby biết bạn đang cố gắng truy cập các phương thức của đối tượng proc - hãy nhớ thậm chí [] chỉ là một phương pháp bạn có thể xác định. Người có dấu chấm rõ ràng cũng hoạt động vì dấu chấm có nghĩa là "gửi thư này đến đối tượng này" (trong trường hợp này là a).

Tôi biết điều đó không "giải quyết" bất cứ điều gì, nhưng tôi hy vọng nó sẽ giúp ích một chút.

+1

Thực tế là ruby ​​là OOP không giải thích lý do tại sao bạn không thể sử dụng '()' để gọi một lambda. Nhiều ngôn ngữ cho phép bạn định nghĩa một phương thức '()' cho các đối tượng của bạn. Câu hỏi thực sự là tại sao ruby ​​không cho phép bạn định nghĩa toán tử '()'? – horseyguy

+1

(Vừa mới thấy nhận xét này ...) Câu hỏi hay. Có lẽ nó có liên quan đến cách bạn có thể bỏ qua dấu ngoặc đơn trong những tình huống nhất định; sẽ là lạ khi có một cuộc gọi nhà điều hành quá tải tiềm ẩn. –

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