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 ?> } >> } mainself 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.