On Thu, 2002-07-04 at 11:19, Andy Wardley wrote:
> On Tue, Jul 02, 2002 at 03:20:35PM -0500, Dan Sugalski wrote:
> > I'm pretty sure the iterators they build are just closures with named 
> > arguments, and behave as any other closure would behave. 
> 
> Not quite.  Ruby iterators expect a block.  This is very much like a closure
> except that block parameters are local to the scope in which the block is 
> defined, not lexically scoped within the block.
> 
> Or in other words, any existing variable of the same name as a block parameter
> will be updated when the block is called.
> 
> An example:
> 
>   n = 10
> 
>   def twice
>     yield 1
>     yield 2
>   end
> 
>   twice { |n| puts "Hello World #{n}" }
> 
>   puts "n is now #{n}"
> 
> The result of this is:
> 
>   Hello World 1
>   Hello World 2
>   n is now 2
> 
> I personally believe this approach is flawed, especially considering the fact 
> that there is no way (that I know of) to force block parameters to be truly
> lexically scoped or temporary (i.e. 'my' or 'local' in Perlspeak).  Much too 
> easy to mangle existing variables like this.
> 

Most people agree. In the future there will be a way of doing that. 
Matz himself has said so.

/Erik

-- 
Erik Bågfors               | [EMAIL PROTECTED]
Supporter of free software | GSM +46 733 279 273
fingerprint: 6666 A85B 95D3 D26B 296B 6C60 4F32 2C0B 693D 6E32

Reply via email to