Inconsistent block parameters handling by instance_eval

Discussion in 'Ruby' started by Patrick Li, Aug 8, 2008.

  1. Patrick Li

    Patrick Li Guest

    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
    --
    Posted via http://www.ruby-forum.com/.
     
    Patrick Li, Aug 8, 2008
    #1
    1. Advertising

  2. On Friday 08 August 2008, Patrick Li wrote:
    > 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
     
    Stefano Crocco, Aug 8, 2008
    #2
    1. Advertising

  3. Patrick Li

    Patrick Li Guest

    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
    --
    Posted via http://www.ruby-forum.com/.
     
    Patrick Li, Aug 8, 2008
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Adam Anderson
    Replies:
    6
    Views:
    145
    Gary Wright
    Nov 7, 2007
  2. Vincent L.
    Replies:
    4
    Views:
    125
    Charles Oliver Nutter
    Jun 4, 2008
  3. Nit Khair
    Replies:
    1
    Views:
    94
    Robert Klemme
    Oct 22, 2008
  4. LAMBEAU Bernard
    Replies:
    9
    Views:
    121
    Mike Gold
    Jan 8, 2009
  5. Robert Klemme
    Replies:
    4
    Views:
    123
    Robert Klemme
    Oct 8, 2009
Loading...

Share This Page