TrueClass/FalseClass vs. Boolean

P

PrimaryKey

Greetings!

I am wondering why there are two separate classes (TrueClass and
FalseClass) to deal with boolean types insead of one class (something
like Boolean?). Do you know
why the library designer desided to use this approach?

Your help will be greatly apreciated.

Thanks
 
E

Eric Hodel

Greetings!

I am wondering why there are two separate classes (TrueClass and
FalseClass) to deal with boolean types insead of one class (something
like Boolean?). Do you know
why the library designer desided to use this approach?

Your help will be greatly apreciated.

This has been discussed many, many times before. Here's a reading list:

http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb?key=TrueClass
+FalseClass&cginame=namazu.rb&submit=Search&dbname=ruby-
talk&max=50&whence=0
 
B

baumanj

Since everything in ruby is an object, there need to be objects for
representing true and false. Once you have those, why do you need a
Boolean class?
 
F

Florian Groß

PrimaryKey said:
I am wondering why there are two separate classes (TrueClass and
FalseClass) to deal with boolean types insead of one class (something
like Boolean?). Do you know
why the library designer desided to use this approach?

I think it is because true and false don't really have anything in
common in Ruby. No way to share code.

You can always fix it pretty easily:

module Boolean; end
[true, false].each do |obj|
obj.extend(Boolean)
end

true.is_a?(Boolean) # => true
false.is_a?(Boolean) # => true

But note that in Ruby all objects (except false and nil) can be used as
true values. And they are used for just that even in the standard library.
 
G

gwtmp01

case y
when Integer
when Boolean
end

case y
when Integer
when TrueClass,FalseClass
end

works ok, right? I kind of wish the class names were just True and
False.


Gary Wright
 
A

ara.t.howard

if a.kind_of? Boolean

case y
when Integer
when Boolean
end

I often wanted this shortcut...

indeed. i tend to use

case obj
when Klass
when TrueClass, FalseClass
end

which is ugly.

another thing a real Boolean class could give is a 'maybe' obj such that

maybe or true -> maybe
maybe or true and false or true -> maybe
maybe and false -> maybe

although i can't think of anything attm to do with this it would undoubtably
lead to some nice logical constructs that more closely parallel the way we
think.

i've brought this up once or twice before - maybe we should just put together
a patch and send to ruby-core?

regards.


-a
 
B

baumanj

What kind of scenarios would you want to use such a construct? It seems
to me not very rubyish to be switching based on the class of an object.
As I understand it, the more conventional way to deal with potentially
diverse argument types is to use the respond_to? method. This keeps the
door open for duck typing.
another thing a real Boolean class could give is a 'maybe' obj such that ....
although i can't think of anything attm to do with this it would undoubtably
lead to some nice logical constructs that more closely parallel the way we
think.

It sounds like you're talking about a sort of restricted fuzzy logic,
which is very cool, but is not appropriate for the core of a general
purpose language. Considering that every expression can be interpreted
in a boolean context, what would a maybe value do? Either behavior
seems wrong.
 
A

ara.t.howard

What kind of scenarios would you want to use such a construct? It seems to
me not very rubyish to be switching based on the class of an object. As I
understand it, the more conventional way to deal with potentially diverse
argument types is to use the respond_to? method. This keeps the door open
for duck typing.

i generally do use duck typing, but sometimes it is simply not appropriate or
become too verbose. for example, consider a matrix class with the following
behaviour

1d

m[true] #=> all data returned
m[] #=> all data returned
m[true] = elems #=> data along all dims set
m[] = elems #=> data along all dims set
m[int] #=> treat as 1d array, return elem
m[int] = elem #=> treat as 1d array, set idx to elem
m[off, len] #=> treat as 1d array, return elems off thru len
m[off, len] = elem #=> treat as 1d array, set elems off thru len to elem
m[a .. b] #=> treat as 1d array, return elems in range
m[a .. b] = elem #=> treat as 1d array, set elems in range to elem
m[n] #=> idx one matrix by another

2d

generalize all above so multiple indices access in multi-dimensional
fashion. eg

m[0,1,2] #= return idx x,y,z
m[0,30..42,true] #= return column 0, rows 30 to 42, in all height dims

now, in case you are thinking that i'm just being difficult, this is exactly
how the narray class works

http://narray.rubyforge.org/SPEC.en

have fun writing that with respond_to? !! ;-)

also, when working with concrete data structures (like binary output from C
programs) it's often quite sufficient to have a type mapping. further more
it's sometimes critical, for instace writing the word located at offset=42,
len=4 with a packed int value or sending a given sequence of bytes down a
socket that a given type is used and it's much more natural to write


def send buf, which = nil
case which
when Fixnum
socket.write [which].pack('N')
socket.write buf
when NilClass
socket.write [buf.size].pack('N')
socket.write buf
when Range
length = which.last - which.first
socket.write [length].pack('N')
socket.write buf[which]
else
raise TypeError, which.class
end
end

than something using respond_to?.

don't get me wrong - i defintely advocate duck typing, but when the number of
possible input types becomes large and behaviour is different depending on
that type it becomes cumbersome. this is the price we pay for not having c--
style polymorphism. in fact, it's very common to see the two styles combined:

case arg
when Fixnum
...
when Range
...
else # dunno - assume String and use in a duck type fashion
end
It sounds like you're talking about a sort of restricted fuzzy logic, which
is very cool, but is not appropriate for the core of a general purpose
language. Considering that every expression can be interpreted in a boolean
context, what would a maybe value do? Either behavior seems wrong.

i disagree - ruby (and hardware) already supports this style of logic in
several ways:

harp:~ > irb
irb(main):001:0> nan = 0.0/0.0
=> NaN
irb(main):002:0> nan * 42
=> NaN
irb(main):003:0> nan * 42 + 42.0
=> NaN
irb(main):004:0> obj = Object.new and obj.taint
=> #<Object:0xb75a5fac>
irb(main):005:0> (obj.to_s << "string").tainted?
=> true
irb(main):006:0> ("string" << obj.to_s).tainted?
=> true

there's no good reason, imho, why this style of logical behaviour could not be
part of the logical classes (TrueClass/FalseClass) and operators (and, or,
not).

regards.

-a
 
G

Gregory Seidman

} > On Fri, 31 Mar 2006, Christian Neukirchen wrote:
} > > if a.kind_of? Boolean
} > >
} > > case y
} > > when Integer
} > > when Boolean
} > > end
}
} What kind of scenarios would you want to use such a construct? It seems
} to me not very rubyish to be switching based on the class of an object.
} As I understand it, the more conventional way to deal with potentially
} diverse argument types is to use the respond_to? method. This keeps the
} door open for duck typing.
[...]

The most obvious answer is that it is needed for various kinds of
serialization. I wrote something like this just the other day. I needed to
do XML-RPC serialization (yes, I know there is XML-RPC support in the
standard library, but I needed something slightly different that was easier
to do by hand), so I needed to know what kind of value I was serializing.

--Greg
 
L

Logan Capaldo

--Apple-Mail-12-175165188
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=US-ASCII;
delsp=yes;
format=flowed


maybe and false -> maybe

Shouldn't this be false?

{true, false} and false is going to be false regardless of what
maybe is


--Apple-Mail-12-175165188--
 
J

John W. Long

case y
when Integer
when TrueClass,FalseClass
end

You could always assign some new constants to them:

True = TrueClass
False = FalseClass

case y
when Integer
when True, False
end
 
F

Florian Frank

John said:
You could always assign some new constants to them:

True = TrueClass
False = FalseClass

case y
when Integer
when True, False
end


Or just use the literal constants, that already exist:

case y
when Integer
when true, false
end
 
G

gwtmp01

Or just use the literal constants, that already exist:
case y
when Integer
when true, false
end

Another example where the Ruby 'does the right thing'.
Thanks for the reminder.


Gary Wright
 
N

Niklas Frykholm

another thing a real Boolean class could give is a 'maybe' obj such that

maybe or true -> maybe
maybe or true and false or true -> maybe
maybe and false -> maybe

What whould this do

print "hello" if maybe

or this

while maybe
print "hello"
end

// Niklas
 
A

ara.t.howard

What whould this do

print "hello" if maybe

or this

while maybe
print "hello"
end

in a conditional it should evaluate to true/false radomly - compute a random
number and look at the last bit for instance, 0 -> false, 1 -> true.

harp:~ > cat a.rb
def maybe() [rand].pack('f').unpack('c').first[0].zero? end

puts "hello" while maybe


harp:~ > ruby a.rb
hello
hello


harp:~ > ruby a.rb
hello
hello
hello
hello


harp:~ > ruby a.rb
hello


harp:~ > ruby a.rb
hello


cheers.

-a
 
L

Logan Capaldo

What whould this do

print "hello" if maybe

or this

while maybe
print "hello"
end

in a conditional it should evaluate to true/false radomly - compute
a random
number and look at the last bit for instance, 0 -> false, 1 -> true.

harp:~ > cat a.rb
def maybe() [rand].pack('f').unpack('c').first[0].zero? end

puts "hello" while maybe


harp:~ > ruby a.rb
hello
hello


harp:~ > ruby a.rb
hello
hello
hello
hello


harp:~ > ruby a.rb
hello


harp:~ > ruby a.rb
hello


cheers.

-a

As if my code wasn't already non-deterministic
 
E

Ed Howland

Another example where the Ruby 'does the right thing'.
Thanks for the reminder.


Another, related issue, is the lack of the <=> operator for either
class. This comes in handy when sorting arrays of booleans or using
sort_by on a collection returned from activerecord that has a boolean
attribute.

I know this has been covered in the archives of this list before, but
I wasn't able to find any definitive answer from Matz or someone else.
I thought it might be because in math Boolean is not really a scalar
or a quantifiable value. Or in sortable collection terms, it doesn't
implement Comparable. Other languages work with sorting on booleans
because they might bind false to 0 and true to > 0. So easily fixed by
the to_i above.

But in terms of Ruby "doing the right thing", you'd expect
[false, true, false].sort
--> [false, false, true]
because it does this just about everywhere else. This is such a common
idiom in CS, that I think Ruby should implement it. But then, I only
have just the 2 cents. Anyone know the main reason it does not?

Ed
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,222
Messages
2,571,142
Members
47,756
Latest member
JulienneY0

Latest Threads

Top