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