2012-02-01 9 views

Trả lời

11

Đó là bởi vì phương pháp của Ruby không phải là đối tượng lớp học đầu tiên (ví dụ như chúng sẽ ở trong ví dụ IO). Vì vậy, khi bạn xác định phương thức bên trong, người nhận là gì? Có lẽ chính phương pháp đó, hay ràng buộc hay cái gì đó, nhưng Ruby không có sâu sắc về OO.

Dù sao, tôi không rõ điều bạn mong đợi xảy ra trong ví dụ của bạn là gì, bạn có muốn sửa đổi varialbe cục bộ a không? Nếu vậy, một proc là một thay thế thích hợp cho một phương pháp.

def test 
    a = "a is for apple" 
    inner_method = lambda do 
    a = "something" 
    end 

    a # => "a is for apple" 
    inner_method.call 
    a # => "something" 
end 

test 

"functional.rb" là ví dụ xa hoa hơn về kiểu lập trình này.

Và "lambda, proc, and Proc.new" là sự cố về các loại đóng cửa khác nhau của Ruby.

+0

Dường như dường như không đúng chỗ khi mọi thứ khác có phạm vi từ vựng. –

+5

"Mọi thứ khác"? Ngoại trừ các khối, * không có gì * có phạm vi từ vựng. Không phải là cơ quan phương pháp. Không phải lớp học. Không phải mô-đun mô-đun. Không phải cơ quan kịch bản. * Khối * là những cái "không đúng chỗ". –

+3

Các phương thức của Scala không phải là các đối tượng hạng nhất, hoặc là các phương thức bên trong gần với môi trường xung quanh của chúng. Có một lý do đơn giản hơn nhiều tại sao "phương thức bên trong" không đóng trên phương thức bên ngoài của nó: vì nó * không phải là * một "phương thức bên trong". Đó là định nghĩa của một phương pháp toàn cầu. –