Si asigno un valor a la variable pp y luego llamo a pp pp en la consola, ¿por qué no se imprime bastante?
$ irb pp = "hello world" => "hello world" pp pp "hello world" => "hello world"De acuerdo con esta explicación, creo que debería
https://blog.brycekerley.net/2014/08/27/Trabajando-con-pp-the-Ruby-Pretty-Printer.html
Editar: no quise decir que debe repetirse, solo quería saber el orden de llamada al método que sucedió y que evitó que se reprodujera.
Ruby es un lenguaje interpretado, lo que significa que, en lugar de compilar, ejecuta el código tal como está escrito, interpretando el código línea por línea, palabra por palabra (o más bien token por token).
Cuando el intérprete de ruby encuentra una línea pp pp , necesita resolver dos tokens. El primero es claramente un método ya que toma un argumento, el otro puede ser un método O una variable local (no hay paréntesis ni argumentos).
Entonces, durante la ejecución, Ruby comenzará la resolución desde el segundo token. Cuando no está claro si token denota variable o método, Ruby siempre busca primero la variable . En este caso, la variable está allí ya que asignó un valor a pp creando una variable local (digamos por pp = 1 ).
Luego, Ruby todavía tiene que procesar el segundo token, pero ahora parece pp(1) (porque el primer token ya se resolvió). En este caso, esto es, nuevamente, claramente un método, por lo que Ruby simplemente pp un mensaje de aplicación a self (que en este contexto es el objeto (principal)). El método pp está definido en Kernel, por lo que cada objeto, incluido (main) , puede acceder a él.
El punto clave aquí es comprender que no ha anulado el método pp ; ese método todavía está allí. Lo único que sucedió es una resolución diferente del token pp . Incluso con pp oculto (o sombreado) por la variable local, aún puede invocarlo usando self.pp explícito o asegurándose de que se vea como un método pp()
Me estoy arriesgando mucho aquí (principalmente por diversión) y supongo que haces algo como esto
>> pp "this is a test" "this is a test" => "this is a test" >> pp = pp => nil >> pp pp nil => nil >> pp "this is another test" "this is another test" => "this is another test"Así que esto es lo que sucede
pp = pp Ha creado una variable local pp a la que se le asignó un valor de cualquier método pp devuelto ( nil en este caso)
>> pp pp aquí llamas al método pp y le pasas la variable pp , que contiene nil
>> pp "this is another test" "this is another test" => "this is another test" todavía puede llamar al método pp como de costumbre.
No estoy seguro de por qué esperarías que se reprodujera. Las expresiones se evalúan (de derecha a izquierda en general), por lo que eventualmente se evaluarán. En general, no deberían ocurrir bucles infinitos. Toma este ejemplo:
x = y = z = x Primero evaluará x más a la derecha (que no se ha definido, por lo que el valor predeterminado es nil , por lo que el próximo paso conceptualmente será:
x = y = z = nilasigna cero a z, y el resultado de esta evaluación también es cero
x = y = nilasigna cero a y y así sucesivamente...