Hi --

On Wed, 23 Nov 2005, Stefan Kaes wrote:

> David A. Black wrote:
>
>> Hi --
>> 
>> On Wed, 23 Nov 2005, Sean E. Russell wrote:
>> 
>>> On Tuesday 22 November 2005 15:37, David A. Black wrote:
>>> 
>>>> Actually I meant what I wrote.  Since 1 is always true, there's no
>>>> point ever testing it for truth.  (I purposely chose an example where
>>>> you get the warning, which you don't if there's any point to the
>>>> test.)
>>> 
>>> 
>>> Yeah, but I think what he was getting at was:
>>>
>>>     def foo x
>>>         if n = x
>>>             blah(n)
>>>         end
>>>     end
>>> 
>>> ... which he'd like to be able to do without being told that he's made a
>>> mistake.  Which he hasn't.  Hence, his request that the warning be 
>>> reworded
>>> to "might", rather than "should".
>>> 
>>> I think the point here is that the message that Ruby is giving is provably
>>> wrong.  If Stefan wrote the above code, then Ruby is wrong to tell him 
>>> that
>>> he "should" be performing a comparison rather than an assignment.
>> 
>> 
> Exactly.
>
>> But that code doesn't produce a warning:
>>
>>   irb(main):011:0> def foo(x); if n = x; end; end
>>   => nil
>>   irb(main):012:0> foo(true)
>>   => nil
>> 
>> The warning is "intelligent".  It only appears in cases where there
>> really is no possibility that the "if" can ever have two branches:
>>
>>   irb(main):013:0> if n = true; end
>>   (irb):13: warning: found = in conditional, should be ==
>>   => nil
>
> This doesn't really make it any better. There is no way a program could read 
> the programmers mind to an extent that would enable the program to know 
> whether the assigment wasn't put there on purpose.
>
> Telling me I've made a mistake when I haven't, is a mistake ;-)
>
> So Ruby can't know whether occurence of an equal sign inside an "if" 
> condition is a programmers intention or not, unless the LHS of the assignment 
> is a constant expression. But that is a completely different error.

We're going around in circles, but the point still doesn't seem to be
clear.

Ruby sees a difference between:

   if n = x

and

   if n = 1

Why you would *ever* want to write the latter is a mystery to me :-)
I mean, you could also wrap your whole program with:

   if true && true && 100
     unless false || nil
     .... ad infinitum.

But why would you?  Besides, keep in mind that this is only a warning.
You *can* do "if n = 1", if you enjoy using those keys on your
keyboard so much that you can't resist :-)  But given that there's no
possibility that you would ever need to (and that in the general case
of if n = x you *don't* get a warning), it seems reasonable to be
warned.


David

-- 
David A. Black
dblack / wobblini.net