Inconsistent block parameters handling by instance_eval

P

Patrick Li

class A
def A.method &block
A.new.instance_eval &block
end

def A.method2 &block
A.new.instance_eval {block.call}
end
end

A.method{p self} #prints #<A:0x28c2858>

A.method2{p self} #prints main

From this example: is instance_eval even working in method2? It clearly
shows that block is not called in A's context.
-Patrick
 
S

Stefano Crocco

class A
def A.method &block
A.new.instance_eval &block
end

def A.method2 &block
A.new.instance_eval {block.call}
end
end

A.method{p self} #prints #<A:0x28c2858>

A.method2{p self} #prints main

From this example: is instance_eval even working in method2? It clearly
shows that block is not called in A's context.
-Patrick

The effect of instance_eval is to set the variable "self" to the receiver for
the duration of the block. In the first case, everything works as expected. In
the second case, instead, self is changed only for the outer block, while in
the inner block "self" remains what it were when the block was defined.
There's nothing new here: the environment in which the block is executed
doesn't affect its variables and the fact that instance_eval treats the outer
block in a special way doesn't otherwise change things.

I hope this helps

Stefano
 
P

Patrick Li

hmmm.... that makes sense.

It seems a bit counter-intuitive though. .. but i guess it would have to
be this way, otherwise closures won't work.
Thanks for the explanation Stefano.
-Patrick
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top