La mayoría conoce _
’s special meaning in IRB as a holder for last return value, pero eso es no lo que estoy preguntando aquí.¿Dónde y cómo se especifica la variable _ (guión bajo)?
En su lugar, estoy preguntando acerca de _
cuando se utiliza como nombre de variable en plain-old-Ruby-code. Aquí parece tener un comportamiento especial, similar a una variable "do not care" (a la Prolog). Estos son algunos ejemplos útiles que ilustran su comportamiento único:
lambda { |x, x| 42 } # SyntaxError: duplicated argument name
lambda { |_, _| 42 }.call(4, 2) # => 42
lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'
lambda { |_| _ + 1 }.call(42) # => 43
lambda { |_, _| _ }.call(4, 2) # 1.8.7: => 2
# 1.9.3: => 4
_ = 42
_ * 100 # => 4200
_, _ = 4, 2; _ # => 2
Estos fueron todos corren en Ruby directamente (con puts
s añaden en) -no IRB-para evitar conflictos con su funcionalidad adicional.
Esto es todo un resultado de mi propia experimentación, ya que no puedo encontrar ninguna documentación sobre este comportamiento en ningún lado (sin duda, no es lo más fácil de buscar). En definitiva, tengo curiosidad de cómo todo esto funciona internamente, así puedo entender mejor qué es lo especial de _
. Así que estoy pidiendo referencias a documentación y, preferiblemente, el código fuente de Ruby (y tal vez RubySpec) que revela cómo se comporta _
en Ruby.
Nota: la mayor parte de esta surgió de this discussion con @Niklas B.
Me pregunto si la diferencia en el comportamiento de 'lambda {| _, _ | _} .call (4, 2) 'entre 1.8 y 1.9 es simplemente un efecto colateral involuntario? Como en circunstancias "normales" donde el nombre de la variable no se puede duplicar, el orden en el que se asignan es irrelevante. –
Wow, me ganaste. +1 –
@AndrewMarshall: Sí, creo que el problema "4 vs 2" es solo un artefacto de cómo el 1.8 y 1.9 manejan la pila. El único momento en que sería notable es '| _, _, ... |' porque el error duplicado se ha suprimido. –