si las declaraciones no introducen alcance en Ruby 1.9, ¿cuál es la razón detrás de este cambio de ruby 1.8?
si las declaraciones no introducen alcance en Ruby 1.9, ¿cuál es la razón detrás de este cambio de ruby 1.8?
Dos razones por las que esto se hizo en Ruby 1.9 están en las siguientes diapositivas, aunque puede no ser obvio sin el diálogo del presentador. Dos cosas que las if
declaraciones sin alcance le permiten hacer es definir cosas en su código fuente a las que se puede acceder fuera de la declaración if.
Primer ejemplo: reemplazar métodos
class Employee
if String.method_defined?(:encode)
def name
...
end
else
def name
...
end
end
end
En este ejemplo, hay dos definiciones diferentes para el name
método. Uno que se usará si el String.encode
método existe y otro (implementación inferior) que se usará si el método de codificación no existe. Básicamente, esto le permite usar una cadena codificada correctamente si las bibliotecas lo admiten.
Segundo ejemplo: reemplazar la implementación
if String.method_defined?(:encode)
module Builder
...
end
else
class String
...
end
end
En este ejemplo, estamos proporcionando una clase / módulo completamente diferente dependiendo de si existe una función de biblioteca. Esto le permite tener un algoritmo completamente diferente que utiliza una nueva función de biblioteca mientras sigue recurriendo a un algoritmo menos eficiente o completo que está lo suficientemente cerca si no existe.
El todo importante por qué
Entonces, ¿qué te compra esto? Si la if
declaración introdujera un nuevo alcance, el nuevo método o clase solo existiría y se usaría dentro de los límites de la if
declaración. Esa restricción hace que sea muy difícil admitir una biblioteca que necesitará cambios para Ruby 2.0 a medida que migremos lejos de 1.9 en el futuro.
Con los dos ejemplos proporcionados en la presentación a la que se vinculó, el razonamiento es mantener una base de código para sus bibliotecas mientras se admiten varias versiones de Ruby. Creo que nació del dolor de la transición entre Ruby 1.8 y Ruby 1.9. A medida que el equipo de Ruby avanza constantemente hacia 2.0, aún podrá apoyar a sus usuarios cuando haya cambios incompatibles. Creo que hubo algunos entre 1.9.1 y 1.9.2. Habrá más en el futuro.
No soy un experto, pero si echas un vistazo a las preguntas frecuentes de Ruby aquí: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
Sección 2.3 "¿Cuándo se vuelve accesible una variable local?" Muestra el comportamiento actual.
Para evitar el problema del alcance, una de las cosas un poco "hacky" que tienes que hacer actualmente es:
Se recomienda poner una declaración de asignación como a = nil antes de acceder a una variable local para no ser molestado por dicho comportamiento de las variables locales.
Yo creo que el 1,9 eliminará la necesidad de hacer esto, y esto podría ser uno de los controladores para el nuevo comportamiento.