On Fri, May 04, 2001 at 02:46:00PM +0100, ruby-talk / ruby-lang.org wrote:
> On Fri, 4 May 2001, Marko Schulz wrote:
> 
> > On Fri, May 04, 2001 at 08:51:32AM +0900, David Alan Black wrote:
> > > On Fri, 4 May 2001, Conrad Schneiker wrote:
> > >
> > > > # On Thu, 3 May 2001, Wayne Scott wrote:
> > > > #
> > > > # >     #simplified for this discussion
> > > > # >     def fetch(arg2)
> > >
> > > [snip]
> > >
> > > > # >                  @cache.dup.each do |arg2, file|       ## (1)
> > >
> > > [snip]
> > >
> > > > # I don't know if the behavior should change but I think it should at
> > > > # least issue a warning if there is reuse like this.
> > > >
> > > > I think this is an important suggestion.
> > > >
> > > > Answers such as:
> > > >
> > > >   1) I should have known better.
> > > >   2) You should have known better.
> > > >   3) Here is a way around this.
> > > >   4) There is (or soon will be) a better feature to use.
> > > >   5) Once you know Ruby better, this won't be a problem for you.
> > > >
> > > > are all true to some degree, but are somewhat beside the point of accident
> > > > prevention in the cases that people are caught unawares.
> > >
> > > I certainly agree that this should not be warned about under -w.
> >
> > I certainly do not agree with you. This should be warned about under -w.
> 
> I think of -w things as things one should never do -- that is, I like
> all code to run clean under -w.  I have to admit that I don't think
> I've ever assigned to an existing variable with the |var| syntax.  But
> I'm not ready to say that there is no possible reason ever to do so.
> 
> I know we (communally) have been around the block (ha ha) on this.
> And I'm a little constrained in defending it, since Matz has said he
> wants to change it :-)  Still, what I don't get is: *if* one accepts
> that in "n = 0 ; ary.each do |n| ... end" one is doing a series of
> assignments to (existing) n, then why is it any more likely that one
> would *accidentally* reuse the name 'n' in such a case than in this
> case:
> 
>   def thing
>     n = 100
>     n = []    # whoops, should have used x, forgot I had an n
>   end
> 
> Should I get a warning there on that second assignment? I think we'd
> agree that in this case, the programmer is expected to take
> responsibility.  It seems to me, then, that in the block case, the
> confusion/mistake is only an issue if one does *not* accept that the
> syntax means what it means.  In other words, it is an assignment in
> current scope, so we should do what we usually do with assignments in
> current scope.
> 
> I know that block syntax comes with certain connotations which "x = y"
> syntax doesn't have, and I know I'm arguing this rigidly.  And I admit
> it's partly because I'm still hoping that |var| won't give way to
> <var>, which I really don't like the appearance of.  But it's only
> partly that :-)
> 

Being new to Ruby, I might completely misunderstand this issue, but for
what it's worth, I'll put my 2c into this discussion.

I think the '<>' syntax is intended to be somewhat akin to the Perl 'local'
directive?  That is, it show it will create a new variable exclusively in
the current scope? This is very useful, and could be thought of as an
explicit recognition of the programmer's intend to shadow a variable.

Since I think this is perfectly useful, like for example in:

	def method(ary)
	  n = nil 
	  ary.each { |n| ... }

	  unless defined n
	     $stderr.puts "warn: nothing in array"
	  else
	     $stderr.puts "last value in array was #{n}"
	end
	
Of course, this is a nonsensical example, since one could check the length
of the array beforehand --- but it is here only to illustrate my point.

Just ignore this if it makes no sense

Regards,

Renald