On 2006.01.28 05:15, Bertram Scharpf wrote:
> Hi,
>
> as I notice there is a difference between `class_eval' called
> with a block or with a string. Why?
Closures again. The @@m in the block is the @@m of M,
not the including class. To see this, add a line to
your code:
> VERSION = :braces
>
> module M
> def self.included c
> case VERSION
> when :braces then c.class_eval {@@m = rand}
> when :quotes then c.class_eval "@@m = rand"
> end
> end
> end
>
> class C ; @@m = "M" ; def d ; puts @@m ; end ; end
> class D ; @@m = "M" ; def d ; puts @@m ; end ; end
>
> class C ; puts @@m ; end
> class D ; puts @@m ; end
> C.new.d
> D.new.d
>
> class C ; include M ; end
> class D ; include M ; end
>
> class C ; puts @@m ; end
> class D ; puts @@m ; end
> C.new.d
> D.new.d
module M; puts @@m; end
> Bertram
E