From: Mohammad Khan Date: 2004-11-12T00:28:35+09:00 Subject: Re: true? & false? The main reason I brought up this issue is: to make differentiation between "a value in boolean context" and "its real value" Example, a = Foo.new b = nil a is *true* in boolean context but it is not really a TrueClass or true. again, b is 'false' in a boolean context but it is not a FalseClass or false. thats why, I proposed to have class Object def true? return ( (self == true) or (self === TrueClass) ) end def false? return ( (self == false) or (self === FalseClass) ) end end so.. again for the above examples: puts "a is true in boolean context" if a puts "a is really a *true*" if a.true? puts "b is false in boolean context" if not b puts "b is really *false*" if b.false? if you find true? and false? is not readable or more complex to use, you might like to write: puts "a is really a *true*" if a == true puts "b is really a *false*" if b == false Thanks again, Mohammad On Thu, 2004-11-11 at 08:08, Robert Klemme wrote: > "Jean-Hugues ROBERT" schrieb im Newsbeitrag > news:6.0.1.1.0.20041111082218.040feec0@pop.mail.yahoo.com... > > Hi, > > > > I think things should stay the way they are, here is > > why. > > > > Things are a little complex about truthness/falseness. > > One has to distinguish the "value" of an object from > > its "truthness". > > I'm not sure whether I follow you here: an object *is* the value. There > is no such thing as a value that is distinct from the object. An object > is interpreted as in boolean contexts according to certain rules (false > and nil => false, all others true); you could call this convention > "truthness", yes. > > > Only nil and false are "false" from a "truthness" > > perspective. All other objects are "true". > > > > For true? and false? to be somehow usefull, I first felt > > that they should relate to the "truthness" of the > > object, not its "value". That is very different from > > nil? (it checks the value of the object, only The nil > > object is nil?). > > > > This leads to: > > class Object > > def true? ; true ; end > > def false? ; not true? ; end > > end > > class NilClass > > def true? ; false ; end > > end > > class FalseClass > > def true? ; false ; end > > end > > You can simplify this to > > class Object > def true?; self end > def false?; not true? end > end > > because it's the standard convention. Basically this adds one level of > indirection (the method call). > > > Usage: 1 - Checking truthness > > if some_thing.true? then > > xxx > > end > > Usage: 2 - Checking value > > if some_thing == true then > > xxx > > end > > > > On the other hand, one may consider that > > checking the value is what matters most, > > versus checking the truthness. > > I never felt the need for "some_thing == true". In which cases do you > need this? > > > This leads to: > > class Object > > def true? ; false ; end > > def false? ; false ; end > > end > > class TrueClass > > def true? ; true ; end > > end > > class FalseClass > > def false? ; true ; end > > end > > You can simplify this, too: > > class Object > def true?; TrueClass === self end > def false?; FalseClass === self end > end > > > Usage: 1 - Checking the truthness > > if some_thing then > > xxx > > end > > Usage: 2 - Checking the value > > if some_thing.true? then > > xxx > > end > > > > Solution 2 (checking values) leads to > > code that is slightly smaller (less characters). > > Which is probably a good thing by itself. > > However, I think that it is fairly unreadable. > > Yep. I find this quite irritating. When I see "if some_thing.true? > then..." I'd expect the truthness of some_thing to be used, not the > outcome of the test whether some_thing is actually the instance 'true'. > > > As a conclusion, I think that the status quo > > is the best solution. Instead of a hard to > > understand true?/false?, let's keep an explicit > > xxx == true when value matters instead of > > truthness. > > .... or "TrueClass === xxx" for that matter. Yes. Totally agree. > > > My 0.2 Euros. > > Now we got 0.22 EUR. :-) > > Kind regards > > robert -- Everyone thinks of changing the world, but no one thinks of changing himself. - Leo Tolstoy