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