2009-06-19 34 views
38

Tôi chắc chắn có một câu trả lời đơn giản cho việc này; Tôi dường như không thể tìm thấy nó. Tôi đã thực hiện một chức năng lồng nhau trong Ruby, và tôi đã gặp khó khăn trong việc tiếp cận các biến từ hàm bên ngoài bên trong hàm bên trong:Ruby truy cập các biến bên ngoài trong hàm lồng nhau

def foo(x) 
    def bar 
    puts x 
    end 
    bar 
    42 
end 

foo(5) 

tôi nhận được: NameError: undefined local variable or method x' cho chính: Object`

Mã Python tương tự hoạt động:

def foo(x): 
    def bar(): 
    print x 
    bar() 
    return 42 

foo(5) 

Vậy làm cách nào để làm điều tương tự trong Ruby?

+9

Một quan trọng (nhưng tinh tế) phân biệt ở đây là def ... cuối định nghĩa một phương pháp, không phải là một chức năng. sử dụng lambda/proc để định nghĩa các hàm và nắm bắt các biến cục bộ trong một bao đóng, như tadman hiển thị. – rampion

Trả lời

44

Theo như tôi biết, việc xác định hàm được đặt tên trong hàm không cho phép bạn truy cập vào bất kỳ biến cục bộ nào.

gì bạn có thể làm thay vào đó là sử dụng một Proc:

def foo(x) 
    bar = lambda do 
    puts x 
    end 
    bar.call 
    42 
end 

foo(5) 
Các vấn đề liên quan