setter1 = proc { | x | y = x } # y is local here
y = 13
setter2 = proc { | x | y = x } # y is nonlocal here
setter1.call(99)
puts y # prints 13
setter2.call(77)
puts y # prints 77
Veamos lo que obtendríamos con la versión equivalente en Scheme
(define setter1 (lambda (x)(set! y x))) (define y 13) (define setter2 (lambda (x)(set! y x))) (setter1 99) (display y) ;; prints 99 (setter1 77) (display y) ;; prints 77
El comportamiento de Ruby es bastante desagradable. Los proc parecen capturar una instantánea del environment que ven en el momento de su creación. Es necesario comprobar si se comparten datos o no. La cuestión ¿tengo ganas de andar con este pobre lenguaje de nuevo?
No hay comentarios:
Publicar un comentario