From: Robert Klemme Date: 2009-01-28T02:46:27+09:00 Subject: Re: How can I get the arguments passed to the caller. 2009/1/27 Stefan Kanev : > Thanks for the advice. I would have never had thought of something as > straightforward as evaling 'local_variables' in the binding. Unfortunatelly, > I believe that this doesn't yield the arguments if they are not named. > > I'm actually trying, out of curiosity, to implement a very straightforward > idea: > > %w{more chunky bacon}.each { puts it.length } > > Like, have *it* to actually be the 'implicit blog argument', not unlike > perl's $_. Again, I'm doing that out of curiosity. Any ideas how I can > accomplish it without touching the interpreter's C code? :) IMHO you can't because the current value is only known by method #each. Wait, you could cook something up using thread local variables 18:41:58 tmp$ ./it.rb 4 6 5 18:42:41 tmp$ cat it.rb #!/bin/env ruby def it Thread.current[:each].last rescue nil end class Array alias _each each def each(&b) stack = Thread.current[:each] ||= [] _each do |val| stack.push val begin b.call ensure stack.pop end end end end %w{more chunky bacon}.each { puts it.length } 18:42:42 tmp$ But note that you have to change *all* implementations of #each which is difficult to achieve because classes can spring into existence all the time. Alternatively write a global each which receives the Enumerable as argument. Cheers robert -- remember.guy do |as, often| as.you_can - without end