Project

General

Profile

Actions

Feature #11848

closed

New #to_b method for String, Symbol, Numeric, NilClass, TrueClass and FalseClass.

Added by prodis (Fernando Hamasaki de Amorim) about 6 years ago. Updated about 5 years ago.

Status:
Rejected
Priority:
Normal
Target version:
-
[ruby-core:72390]

Description

New to_b method converts strings, symbols, numbers and nil values in a boolean value.

to_b method is available on String, Symbol, Numeric, TrueClass, FalseClass and NilClass classes.

String

Returns true if string is one of t, true, on, y, yes or 1 values. Returns false otherwise.
Ignores trailing spaces and letter cases.

't'.to_b        # => true
'true'.to_b     # => true
'on'.to_b       # => true
'y'.to_b        # => true
'yes'.to_b      # => true
'1'.to_b        # => true

''.to_b         # => false
'0'.to_b        # => false
'2'.to_b        # => false
'-1'.to_b       # => false
'f'.to_b        # => false
'false'.to_b    # => false
'off'.to_b      # => false
'n'.to_b        # => false
'no'.to_b       # => false
'wherever'.to_b # => false

Symbol

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

:f.to_b        # => false
:false.to_b    # => false
:off.to_b      # => false
:n.to_b        # => false
:no.to_b       # => false
:wherever.to_b # => false

Numeric

Returns false if number is zero. Returns true otherwise.

Integer

0.to_b  # => false
1.to_b  # => true
2.to_b  # => true
-1.to_b # => true
-2.to_b # => true

Float

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

BigDecimal

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

NilClass

Returns false.

nil.to_b # => false

TrueClass

Returns true.

true.to_b # => true

FalseClass

Returns false.

false.to_b # => false

Files

to_b_method.diff (9.63 KB) to_b_method.diff prodis (Fernando Hamasaki de Amorim), 12/19/2015 05:06 PM

Related issues

Has duplicate Ruby master - Feature #12012: Add Boolean methodRejectedActions

Updated by prodis (Fernando Hamasaki de Amorim) about 6 years ago

  • Tracker changed from Bug to Feature

Updated by marcandre (Marc-Andre Lafortune) about 6 years ago

  • Status changed from Open to Feedback
  • Assignee set to matz (Yukihiro Matsumoto)

So many decisions in this seem completely arbitrary (and inconsistent), plus you don't give a use case, there's no way this would ever be accepted.

I'd suggest you build your own hash of true/false values and use that.

Updated by matz (Yukihiro Matsumoto) about 6 years ago

  • Status changed from Feedback to Rejected

You forgot empty string/array/hash to be false. ;-)
But Ruby is not Python.

Matz.

Updated by Eregon (Benoit Daloze) about 6 years ago

I like the idea of having explicit conversion between booleans/integers, such that 0.to_b => false and true.to_i => 1.
!int.zero? can be a workaround for the first conversion but I only see a ternary condition for the second case.
Also, nil.to_i is already 0.

Actions #6

Updated by naruse (Yui NARUSE) almost 6 years ago

Updated by avit (Andrew Vit) almost 6 years ago

I've had to do this in a few places over the years myself:

TRUTHY_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE', 'y', 'Y', 'yes', 'YES']
FALSY_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE', 'n', 'N', 'no', 'NO']

You forgot empty string/array/hash to be false. ;-)

I think the main reason for this is handling user input (from a file like CSV or other), so other types like Array/Hash are not expected there: just basic scalar values.

Still, it probably only makes sense for some specific situations.

Updated by prodis (Fernando Hamasaki de Amorim) about 5 years ago

Andrew Vit wrote:

I've had to do this in a few places over the years myself:

TRUTHY_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE', 'y', 'Y', 'yes', 'YES']
FALSY_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE', 'n', 'N', 'no', 'NO']

You forgot empty string/array/hash to be false. ;-)

I think the main reason for this is handling user input (from a file like CSV or other), so other types like Array/Hash are not expected there: just basic scalar values.

Still, it probably only makes sense for some specific situations.

Andrew Vit, you can use wannabe_bool gem: https://github.com/prodis/wannabe_bool

Actions

Also available in: Atom PDF