tengo este código:Cambie la unión de un Proc en Ruby
l = lambda { a }
def some_function
a = 1
end
sólo quiero acceder a
por el lambda y un endoscopio especial que se ha definido a
ya en algún lugar como en el interior some_function
en el ejemplo, o Sólo poco más tarde en el mismo alcance que:
l = lambda { a }
a = 1
l.call
Entonces me encontré al llamar l
, todavía está utilizando su propia unión, pero no uno nuevo donde fue llamado.
Y luego traté de utilizarlo como:
l.instance_eval do
a = 1
call
end
Pero esto también fracasó, es extraño que no puedo explicar por qué.
Sé que la solución está usando eval
, en el que podría especializar una encuadernación y ejecutar algún código en el texto, pero realmente no quiero usarlo.
Y sé que puede usar una variable global o una variable de instancia. Sin embargo, en realidad mi código está en un entorno incrustado más profundo, por lo que no quiero romper las partes completadas si no es absolutamente necesario.
He referido la clase Proc
en la documentación, y he encontrado los nombres de una función binding
que hacen referencia al contexto de Proc
. Mientras que la función solo proporcionaba una forma de acceder a su enlace pero no puede cambiarlo, excepto al usar Binding#eval
. También evalúa el texto, que es exactamente lo que no me gusta hacer.
Ahora la pregunta es, ¿tengo una mejor (o más elegante) forma de implementar esto? O utilizando eval
ya es el regular manera?
Editar para responder a @ Andrew:
Bueno, esto es un problema que me encontré cuando estoy escribiendo un analizador léxico, en la que he definido una matriz con número fijo de elementos, hay que incluye al menos un Proc
y una expresión regular. Mi propósito es hacer coincidir las expresiones regulares y ejecutar los Procs bajo mi ámbito especial, donde el Proce implicará algunas variables locales que se deben definir más adelante. Y luego encontré el problema anterior.
En realidad, supongo que no es completamente igual a that question, ya que la mía es cómo pasar en vinculante a un Proc en lugar de cómo pasarlo .
@Niklas: Tengo su respuesta, creo que eso es exactamente lo que quiero. Ha solucionado mi problema perfectamente.
Tal vez una buena pregunta para qué se * * ¿quiere hacer esto, o, más bien, ¿qué estás tratando de lograr en última instancia? –
@Andrew: No lo sé. Me interesaría una respuesta a esta pregunta exacta, en lugar de una solución al problema subyacente :) –
@NiklasB. Estoy de acuerdo, pero conocer el objetivo final puede ayudar a comprender mejor el problema. Y estoy bastante seguro de haber respondido una pregunta similar hace un tiempo, y estoy tratando de encontrarlo, pero no puedo ': ('. –