2012-02-22 20 views
16

Soy nuevo a Ruby, y parece que Ruby hace variables de apoyo definidas fuera el método que se accede ahora cuando quiero hacer algo:Ruby no puede acceder a la variable fuera del método?


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

Cuando traté de ejecutarlo tengo el error:

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

parece que no puedo acceder a la variable interna del método template y resultgenerateMethods?

¿Por qué?


Actualización:

Parece que el concepto es el alcance difieren de lo que es en el javascript?

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

El código anterior funcionará.

+1

Hay una respuesta adecuada para esta pregunta [aquí] (http://stackoverflow.com/a/10782889). – starfry

Respuesta

14

Las variables result y template dentro de la función generateMethods son diferentes de las declaradas fuera y son locales para esa función. Se podría declarar como variables globales con $:

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

Pero lo que es su propósito con esta función? Creo que hay una forma más clara de hacerlo si puedes explicar más tu pregunta.

+0

De hecho, solo quiero generar algunos métodos en JavaScript de acuerdo con el nombre de la función. – hguser

+0

@hguser no se recomienda en ruby ​​usar variables globales, como saber que no se recomienda en JavaScript para evitar conflictos de nombres, encontrar una mejor manera de manejar las variables que declararlas globalmente – bjhaid

-3

Las variables locales son locales con el alcance que se definen en Es por eso que se llaman variables locales, después de todo.!

Ergo, no puede acceder a ellas desde un alcance diferente. Ese es el punto entero de variables locales.

+30

Funciona de manera diferente en JavaScript (y Python), presumiblemente la fuente de confusión del OP Su respuesta sería más útil si no actuó como si la forma de hacer las cosas de Ruby fuera evidente. – Antimony

Cuestiones relacionadas