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. And why do I get this warning even if I haven't turned warnings on? This seems wrong too. -- stefan