2012-02-22 47 views
16

Tôi mới đến Ruby, và có vẻ như rằng Ruby không biến hỗ trợ định nghĩa bên ngoài phương pháp này được truy cập chỉ là bây giờ khi tôi muốn làm điều gì đó:Ruby không thể truy cập biến ngoài phương thức?


template=<<MTEMP 
#methodName#:function(){}, 
MTEMP 
result=""; 
def generateMethods(mds) 
    mds.each do |md| 
    result+=template.gsub(/#methodName#/,md).to_s+"\n"; 
    end 
    result; 
end 

puts generateMethods(['getName','getAge','setName','setAge']) 

Khi tôi cố gắng chạy nó tôi đã nhận lỗi:

undefined local variable or method 'template' for main:Object (NameError)

dường như tôi không thể truy cập các biến bên trong phương pháp templateresultgenerateMethods?

Tại sao?


Cập nhật:

Dường như khái niệm phạm vi là khác với những gì có trong javascript?

var xx='xx'; 
function afun(){ 
    console.info(xx); 
} 

Mã trên sẽ hoạt động.

+1

Có một câu trả lời phù hợp cho câu hỏi này [ở đây] (http://stackoverflow.com/a/10782889). – starfry

Trả lời

14

Các biến số resulttemplate bên trong hàm generateMethods khác với hàm được khai báo bên ngoài và là cục bộ cho hàm đó. Bạn có thể khai báo như là biến toàn cầu với $:

$template=<<MTEMP 
#methodName#:function(){}, 
MTEMP 
$result=""; 
def generateMethods(mds) 
    mds.each do |md| 
    $result+=$template.gsub(/#methodName#/,md).to_s+"\n"; 
    end 
    $result; 
end 
puts generateMethods(['getName','getAge','setName','setAge']) 

Nhưng mục đích của bạn với chức năng này là những gì? Tôi nghĩ rằng có một cách sạch hơn để làm điều này nếu bạn có thể giải thích câu hỏi của bạn nhiều hơn nữa.

+0

Trong thực tế, tôi chỉ muốn tạo ra một số phương thức trong javascript theo tên hàm. – hguser

+0

@hguser nó không được khuyến khích sử dụng các biến toàn cầu, như bạn biết nó không được đề xuất trong javascript để tránh xung đột đặt tên, tìm cách tốt hơn để xử lý các biến của bạn hơn khai báo chúng toàn cầu – bjhaid

-3

biến địa phương địa phương để phạm vi chúng được định nghĩa trong Đó là lý do tại sao chúng được gọi là địa phương biến, sau khi tất cả.!

Ergo, bạn không thể truy cập chúng từ một phạm vi khác. Đó là toàn bộ điểm của các biến địa phương.

+30

Nó hoạt động khác nhau trong Javascript (và Python), có lẽ nguồn gây nhầm lẫn của OP. Câu trả lời của bạn sẽ hữu ích hơn nếu bạn không hành động như cách làm của Ruby là điều hiển nhiên. – Antimony

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