Feature #21556
closedAdd true? and false? methods to NilClass, TrueClass, FalseClass, and String
Added by Phalado (Raphael Cordeiro) 5 days ago. Updated 2 days ago.
Description
Sometimes we need to check for an exact true
or false
value. This can be a string or a boolean value.
Usually, what I do to solve this is something like value.to_s == true
, this way covering for strings, booleans, and nil values.
The idea of these new methods is to check for the exact value, being it a String, a Boolean, or even a Nil value.
This is the result obtained:
# String
'true'.true? # true
'false'.true? # false
''.true? # false
'true'.false? # false
'false'.false? # true
''.false? # false
# Boolean
true.true? # true
true.false? # false
false.true? # false
false.false? # true
# Nil
nil.true? # false
nil.false? # false
Updated by nobu (Nobuyoshi Nakada) 5 days ago
- Status changed from Open to Feedback
Phalado (Raphael Cordeiro) wrote:
Sometimes we need to check for an exact
true
orfalse
value. This can be a string or a boolean value.
For what situation, and why mixing strings and true
/false
?
It sounds like depending on applications/libraries.
Updated by Phalado (Raphael Cordeiro) 4 days ago
nobu (Nobuyoshi Nakada) wrote in #note-1:
Phalado (Raphael Cordeiro) wrote:
Sometimes we need to check for an exact
true
orfalse
value. This can be a string or a boolean value.For what situation, and why mixing strings and
true
/false
?
It sounds like depending on applications/libraries.
Data received on requests and JSON conversion. It's not unusual that a Boolean is converted to a String, or users end up filling in as a String instead of a Boolean.
Updated by austin (Austin Ziegler) 4 days ago
Phalado (Raphael Cordeiro) wrote in #note-2:
nobu (Nobuyoshi Nakada) wrote in #note-1:
Phalado (Raphael Cordeiro) wrote:
Sometimes we need to check for an exact
true
orfalse
value. This can be a string or a boolean value.
For what situation, and why mixing strings andtrue
/false
?
It sounds like depending on applications/libraries.
Data received on requests and JSON conversion. It's not unusual that a Boolean is converted to a String, or users end up filling in as a String instead of a Boolean.
If you're checking a string for the value "true"
, you're not checking for an exact true
or false
value. This is a data conversion applicable to an application, library, or framework (that is, it might be a viable feature for ActiveSupport) but I don't believe it belongs as part of the language core.
I'm mostly doing Elixir these days where in a library I made I have explicitly handled this with an as_boolean(value, options)
conversion where the options include choices like:
- which values are truthy (by default
true
or1
) - which values are fasly (the inverse of
truthy
and cannot be specified withtruthy
) - a default value (
false
by default) - and whether values should be downcased (
TRUE
would be truthy)
Simply saying value.true?
isn't something that the language should be specifying. What would the value of 0.true?
be (it depends; in shell scripts, 0
is success; in C, 0
is false; in Ruby 0
is truthy because it's not false
or nil
).
I'm very negative on this for core.
Updated by shan (Shannon Skipper) 3 days ago
· Edited
I wonder if the inclusion of the String variant could be considered again even though it has been merged? Is there a domain where "true"
and "false"
Strings are used? The Rails variant trying to support env vars makes more sense to me than string == 'true'
test since you can string == 'true'
trivially. Having "True".true? #=> false
seems a bit counterintuitive.
I think the true/false/nil ones seem totally make sense.
Edit: Rereading the issue, I think I somehow missed that the point of the feature was bool and String both being supported. Sorry for the noise. I'm still curious if a mix of String of exactly true/false Strings and bool is something typical?
Updated by Phalado (Raphael Cordeiro) 2 days ago
· Edited
austin (Austin Ziegler) wrote in #note-3:
Phalado (Raphael Cordeiro) wrote in #note-2:
nobu (Nobuyoshi Nakada) wrote in #note-1:
Phalado (Raphael Cordeiro) wrote:
Sometimes we need to check for an exact
true
orfalse
value. This can be a string or a boolean value.
For what situation, and why mixing strings andtrue
/false
?
It sounds like depending on applications/libraries.
Data received on requests and JSON conversion. It's not unusual that a Boolean is converted to a String, or users end up filling in as a String instead of a Boolean.If you're checking a string for the value
"true"
, you're not checking for an exacttrue
orfalse
value. This is a data conversion applicable to an application, library, or framework (that is, it might be a viable feature for ActiveSupport) but I don't believe it belongs as part of the language core.I'm mostly doing Elixir these days where in a library I made I have explicitly handled this with an
as_boolean(value, options)
conversion where the options include choices like:
- which values are truthy (by default
true
or1
)- which values are fasly (the inverse of
truthy
and cannot be specified withtruthy
)- a default value (
false
by default)- and whether values should be downcased (
TRUE
would be truthy)Simply saying
value.true?
isn't something that the language should be specifying. What would the value of0.true?
be (it depends; in shell scripts,0
is success; in C,0
is false; in Ruby0
is truthy because it's notfalse
ornil
).I'm very negative on this for core.
Well, the idea is to recognize true/false values, ignoring truthy/falsy values because of JSON.
I also think this is something very 'Ruby' to do, like the method .zero?
just to check if a value is equal to zero.
But I respect your opinion and truly appreciate it.
Updated by Phalado (Raphael Cordeiro) 2 days ago
shan (Shannon Skipper) wrote in #note-4:
I wonder if the inclusion of the String variant could be considered again even though it has been merged? Is there a domain where
"true"
and"false"
Strings are used? The Rails variant trying to support env vars makes more sense to me thanstring == 'true'
test since you canstring == 'true'
trivially. Having"True".true? #=> false
seems a bit counterintuitive.I think the true/false/nil ones seem totally make sense.
Edit: Rereading the issue, I think I somehow missed that the point of the feature was bool and String both being supported. Sorry for the noise. I'm still curious if a mix of String of exactly true/false Strings and bool is something typical?
The idea here came when working with JSON from requests and, especially, Active Admin. Users sometimes fill boolean values as true, other times as "true", which can be a problem if you are expecting a boolean or a string specifically. Also, a nil value can be considered 'false', which is not always the case when treating data.
So, instead of checking for nil, converting it to string and, in the end, checking if it'1s equal to 'true' or 'false' (kinda converting to boolean) I came with this, where Strings, Booleans and Nil values can live together in harmony.