ventajas tutorial sirve rails que pelicula para desventajas descargar ruby

tutorial - ruby wikipedia



No entiendo el alcance local de ruby (5)

En este ejemplo,

def foo(x) if(x > 5) bar = 100 end puts bar end

Entonces foo (6) Salidas: 100 y foo (3) no producen nada.

Sin embargo, si cambié la definición a

def foo(x) if(x > 5) bar = 100 end puts bob end

Aparece un error de "variable o método local indefinido".

¿Entonces mi pregunta es por qué no recibo este error cuando llamo a foo (3) y la barra nunca está configurada?


Hay un par de cosas pasando aquí. Primero, las variables declaradas dentro del bloque if tienen el mismo alcance local que las variables declaradas en el nivel superior del método, razón por la cual la bar está disponible fuera del if . En segundo lugar, está recibiendo ese error porque bob se referencia de la nada. El intérprete de Ruby nunca lo ha visto y nunca lo ha visto inicializado. Sin embargo, ha visto bar inicializada antes, dentro de la instrucción if. Entonces cuando se pone en la barra, sabe que existe. Combina esos dos y esa es tu respuesta.


No estoy seguro de lo que estás preguntando. Ejecutar foo(3) con la segunda definición siempre dará un error, ya que bob nunca se define. El argumento para el método no cambia eso.


Por lo tanto, no tome esto como un evangelio (ya que se basa más en la observación que en la comprensión), pero parece que el intérprete de rubíes señalará cualquier palabra (sin un símbolo delante) a la izquierda de un signo igual como local . Tu ejemplo es extraño, esto es aún más extraño

def foo bar = bar puts bar // nil, which gets coerced into "" end

No entiendo por qué o cómo funciona, pero ahí lo tienes.


Su segundo ejemplo es en realidad una pista falsa: la razón por la que está recibiendo una excepción no es porque bob no está inicializado, sino porque es ambiguo. Es imposible decir si es una variable o un método.

Su primer ejemplo funciona, porque las variables locales no inicializadas (así como las variables globales y las variables de instancia) se evalúan como nil . Por lo tanto, la puts bar está perfectamente bien: en un caso, la bar se inicializa a 100 y esto se evalúa a 100 , en el otro caso no se inicializa y, por lo tanto, se evalúa como nil . puts llamadas to_s en su argumento, que se define para nil (simplemente devuelve la cadena vacía), por lo que todo está bien y elegante.

Ver también en Ruby, ¿por qué después de comenzar irb, foo.nil? dice error indefinido, y @ foo.nil? da "verdadero", y @@ wah.nil? da error de nuevo?


foo(3) no produce nada. Muestra una nueva línea.

Usar inspect le daría más de una pista:

def foo(x) if(x > 5) bar = 100 end puts bar.inspect end foo(3)

imprime

nil

bar es una variable completamente desarrollada, que simplemente tiene un valor de nil .