If string, numeric, symbol and nil values wanna be a boolean value, they can with the new to_b
method.
Moreover, you can use WannabeBool::Attributes
module to create predicate methods in your classes.
gem 'wannabe_bool'
$ gem install wannabe_bool
to_b
method is available on String
, Symbol
, Numeric
, TrueClass
, FalseClass
and NilClass
.
For sake of readability (and personal choice), to_b
has two aliases:
to_bool
to_boolean
Given this example:
{
one: 'value',
two: 2,
mobile?: params[:mobile].to_b
}
It could be "more readable" like this:
{
one: 'value',
two: 2,
mobile?: params[:mobile].to_boolean
}
Don't forget to require the gem:
require 'wannabe_bool'
- Returns
true
if string is one of these values: t, true, on, y, yes, 1. - Returns
false
if string is one of these values: f, false, off, n, no, 0. - For invalid boolean string representations, returns
false
by default. See "Invalid Value Behaviour" section for more options.
It ignores trailing spaces and letter cases.
'1'.to_b # => true
't'.to_b # => true
'T'.to_b # => true
'true'.to_b # => true
'TRUE'.to_b # => true
'on'.to_b # => true
'ON'.to_b # => true
'y'.to_b # => true
'yes'.to_b # => true
'YES'.to_b # => true
' 1 '.to_b # => true
' t '.to_b # => true
' T '.to_b # => true
' true '.to_b # => true
' TRUE '.to_b # => true
' on '.to_b # => true
' ON '.to_b # => true
' y '.to_b # => true
'Y'.to_b # => true
' Y '.to_b # => true
' yes '.to_b # => true
' YES '.to_b # => true
'0'.to_b # => false
'f'.to_b # => false
'F'.to_b # => false
'false'.to_b # => false
'FALSE'.to_b # => false
'off'.to_b # => false
'OFF'.to_b # => false
'n'.to_b # => false
'N'.to_b # => false
'no'.to_b # => false
'NO'.to_b # => false
' 0 '.to_b # => false
' f '.to_b # => false
' F '.to_b # => false
' false '.to_b # => false
' FALSE '.to_b # => false
' off '.to_b # => false
' OFF '.to_b # => false
' n '.to_b # => false
' N '.to_b # => false
' no '.to_b # => false
' NO '.to_b # => false
''.to_b # => false
' '.to_b # => false
You can configure the result for invalid boolean string representations, using the WannabeBool.invalid_value_behaviour
option.
There are 3 predefined behaviours available: to return false
(default), nil
or raise an ArgumentError
:
WannabeBool.invalid_value_behaviour = WannabeBool::InvalidValueBehaviour::False
'wherever'.to_b # => false
WannabeBool.invalid_value_behaviour = WannabeBool::InvalidValueBehaviour::Nil
'wherever'.to_b # => nil
WannabeBool.invalid_value_behaviour = WannabeBool::InvalidValueBehaviour::Error
'wherever'.to_b # => ArgumentError: is not a valid boolean representation
Moreover, you can provide your own behaviour for invalid boolean string representations. Just set a proc or lambda, or even any class or object that responds to call
method.
WannabeBool.invalid_value_behaviour = -> { :prodis }
'wherever'.to_b # => :prodis
Note that WannabeBool.invalid_value_behaviour
is a global configuration. Said that, all the results for to_b
method with invalid boolean string representations will be affected.
Same as symbol.to_s.to_b
.
:'1'.to_b # => true
:t.to_b # => true
:true.to_b # => true
:on.to_b # => true
:y.to_b # => true
:yes.to_b # => true
:'0'.to_b # => false
:f.to_b # => false
:false.to_b # => false
:off.to_b # => false
:n.to_b # => false
:no.to_b # => false
Returns false
if number is zero. Returns true
otherwise.
0.to_b # => false
1.to_b # => true
2.to_b # => true
-1.to_b # => true
-2.to_b # => true
0.0.to_b # => false
0.1.to_b # => true
1.0.to_b # => true
-0.1.to_b # => true
-1.0.to_b # => true
require 'bigdecimal'
BigDecimal('0.0').to_b # => false
BigDecimal('0.1').to_b # => true
BigDecimal('1.0').to_b # => true
BigDecimal('-0.1').to_b # => true
BigDecimal('-1.0').to_b # => true
Returns true
.
true.to_b # => true
Returns false
.
false.to_b # => false
Returns false
.
nil.to_b # => false
class Fake
include WannabeBool::Attributes
attr_accessor :name, :main, :published
attr_wannabe_bool :main, :published
end
fake = Fake.new
fake.main? # => false
fake.published? # => false
fake.main = true
fake.main? # => true
fake.published = 1
fake.published? # => true
fake.main = 'true'
fake.main? # => true
fake.published = :true
fake.published? # => true
See the changes in each version.