Tal vez esta es una pregunta estúpida, pero no puedo resolverlo. Tengo la "sensación" de por qué main
es self
durante la ejecución del bloque. Pero no tengo una explicación sólida para ello.
Parece que la pregunta de quién es self
depende del contexto en el que se define el bloque. ¿Es esto correcto?
¿Puede alguien explicármelo?
?> class Klass ?> def yld ?> yield ?> end >> end >> >> o1 = Klass.new >> o2 = Klass.new >> ?> o1.yld { ?> o2.yld { ?> p self ?> } >> } main
self
no cambia debido a un bloqueo. La razón por la que obtienes main
es porque estás llamando a yld
desde el contexto principal:
p self #=> main o1.yld { p self #=> main o2.yld { p self #=> main } p self #=> main } p self #=> main
Sin embargo, self
se puede cambiar explícitamente, por ejemplo, a través deinstance_eval
:
def foo(&block) "hello".instance_eval(&block) end p self #=> main foo { p self #=> "hello" p size #=> 5 p upcase #=> "HELLO" } p self #=> main
En el código anterior, self
se cambia a la instancia de cadena "hello"
durante el bloque.