From: John Small Date: 2000-10-25T01:12:56+09:00 Subject: [ruby-talk:5820] Re: local variables (nested, in-block, parameters, etc.) Hi Matz, this seems consistent if you think of block parameters as well as block local parameters as merely being a call by name closure of the surrounding context. If the block parameters and block local variables are not referred to by name in the enclosing local context, after as well as before the block expression then these block parameters and local variables are local to the block only. In other words block parameters and block locals are in block scope unless they are defined as local to the context the block closure sees both before and after the block expression. I have another request and since I've only been programming in Ruby under a week it might be a dumb request. If there are way to exit a block used in conjunction with an iterator/enumerator? In other words is there a way to break out of the loop: [1,2,3].each { | i | print "\n#{i}"; break if (i >= 2) } which would produce: 1 2 John p.s. I got a good chunk of that Ruby ODBC driver finished over the weekend but I'm not pulled off working on a rush job in Perl. ----- Original Message ----- From: "Yukihiro Matsumoto" To: "ruby-talk ML" Sent: Tuesday, October 24, 2000 10:59 AM Subject: [ruby-talk:5819] Re: local variables (nested, in-block, parameters, etc.) > Hi, > > In message "[ruby-talk:5818] Re: local variables (nested, in-block, parameters, etc.)" > on 00/10/24, ts writes: > > |G> So, does this amount to it *creating* a local var to bind to if no local > |G> var already exists? GREAT idea. And I don't think it would cause much > |G> incompatibility since if no local var was seen, then it probably isn't > |G> used later, either (or if it is, is probably initialized). The only > | > | It break some closure, for example in test.rb > | > | eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x > | test_ok($x[4].call == 8) > > I'm thinking of adding a new rule that the scope of a new block > parameter (|| variable) is extended if it is referred out of the > block. So i5 in > > > eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x > > test_ok($x[4].call == 8) > > will be in-block variable (as is now). But i6 in > > [1,2,3].each{|i6| break if i6 % 2 == 0} > p i6 # referred out of a block > > will be a plain local variable. How do you think? > Too complicated? > > matz. >