From: matz@... (Yukihiro Matsumoto) Date: 1999-12-31T17:09:25+09:00 Subject: [ruby-talk:01013] Re: Reparenting a block In message "[ruby-talk:01009] Reparenting a block" on 99/12/31, Dave Thomas writes: |Another block question. Is there any way to re-parent a Proc? An Block has the bindings at the point where it appear, including self, local variables, constant bindings, etc. You can alternate self in the block bindings by using instance_eval(), as Masaki stated in [ruby-talk:01010]. Other than self, you can alter constant binding by using class_eval()/module_eval(). def foo(&block) Math.module_eval(&block) end foo {print PI} # 3.141592654 print PI # NameError! self and constant bindings are only modifiable bindings in the block. You cannot alter other bindings. Ruby/Tk is using this technics. TkButton::new(parent) { label "hello world" command { exit } } invokes methods of a newly created TkButton object. But it may be the cause of confusion, e.g. Dave::new { @answer = 42 # modify Dave's instance variable. } print @answer # @answer is not set here. Hope this helps you in new millennium. :-) Happy new year. matz.