2012-02-22 13 views
16

Jestem nowym Ruby, i wydaje się, że Ruby nie zmienne wsparcia zdefiniowane poza metoda jest dostępna tylko teraz, kiedy chcę coś zrobić:Ruby nie może uzyskać dostępu do zmiennej poza metodą?


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']) 

Kiedy próbowałem go uruchomić mam błąd:

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

wydaje się, że nie może uzyskać dostępu do zmiennej wewnętrznej metody template i resultgenerateMethods?

Dlaczego?


Aktualizacja:

Wydaje się, że koncepcja jest zakres różni się od tego, co jest w javascript?

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

Powyższy kod zadziała.

+1

Istnieje odpowiednia odpowiedź na to pytanie [tutaj] (http://stackoverflow.com/a/10782889). – starfry

Odpowiedz

14

Zmienne result i wewnątrz funkcji generateMethods różnią się od tych zadeklarowanych na zewnątrz i są lokalne dla tej funkcji. Można zadeklarować je jako zmiennych globalnych z $:

$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']) 

Ale jaki jest twój cel z tej funkcji? Sądzę, że istnieje lepszy sposób, aby to zrobić, jeśli potrafisz lepiej wyjaśnić swoje pytanie.

+0

Po prostu chcę wygenerować niektóre metody w javascript zgodnie z nazwą funkcji. – hguser

+0

@hguser nie jest zalecane w ruby ​​używać zmiennych globalnych, jak wiesz, nie jest zalecane w javascriptu, aby uniknąć konfliktów nazw, znaleźć lepszy sposób na obsługę zmiennych niż deklarowanie ich globalnie – bjhaid

-3

Zmienne lokalne są lokalne do zakresu są zdefiniowane w Dlatego są one nazywane lokalnych zmiennych, po wszystkim.!

Ergo, nie można uzyskać do nich dostępu z innego zakresu. To jest cały punkt zmiennych lokalnych.

+30

Działa to inaczej w JavaScript (i Pythonie), prawdopodobnie źródło zamieszania związane z PO. Twoja odpowiedź byłaby bardziej pomocna, gdybyś nie zachowywał się tak, jak robi to Ruby. – Antimony

Powiązane problemy