Feature #17265
closedAdd `Bool` module
Description
1-line Summary: rbs
would benefit from the existence of common ancestor Bool
for TrueClass
and FalseClass
.
Detail:
Matz: I am aware you rejected a similar request, but could we revisit this in light of RBS?
One use case was for an easy way to check for true
or false
values, instead of simply for truthiness (e.g. for data transfer, strict argument checking, testing, etc.)
I believe there's a new use case: RBS
In RBS
, the most used types like String
and Integer
have types for "string-like" and "integer-like" objects: string
and integer
(all lowercase).
For example the signature for Integer#>>
is:
def >>: (int) -> Integer
It accepts an Integer
or an object responding to to_int
(summarized by int
) and returns an Integer
(and never another class of object responding to to_int
or not).
There is a similar idea with boolean values, where a method may accept any object and will use it's truthiness, while returning true | false
. For example one of the interface for Enumerable#all?
should look like:
def all?: () { (Elem) -> bool } -> true | false
The user supplied block can return any value, and its truthiness (anything else than nil
or false
) will be used to determine the result of all?
. That result will be true | false
, and no other value.
If RBS is to be popular, there will be many signatures for such predicates (in builtin Ruby, stdlib, any gems, applications, etc.). I feel the best option would be Bool
, if this would be reflected in Ruby itself.
Proposal: a new global module called Bool
, without any method of constant, included in TrueClass
and FalseClass
.
Following reasons for rejection were given at the time:
many gems and libraries had already introduced Boolean class. I don't want to break them.
I looked and found the bool
gem that defines a Bool
module. My proposal is compatible. In any case, this gem looks abandoned, the author Aslak Hellesøy doesn't have the code on github, the gem has had 7000 downloads in the past 6 years and has no public reverse dependency. It also fails to install on my machine.
I am not aware of incompatibilities.
true
andfalse
are the only representative of true-false values. In Ruby.nil
andfalse
are falsy values, and everything else is a true value. There's no meaning for having a superclass ofTrueClass
andFalseClass
asBoolean
.
The proposal is exactly to be able to easily write about this duality of Bool
as having only true
and false
as members, and every Ruby object as being implicitly convertible as being truthy or falsy (bool
in RBS).
Discussion in RBS:
Previous feature requests for Boolean
: