11

Ruby 3.1 adds try_convert method to Integer class for implicit conversions

 3 years ago
source link: https://blog.saeloun.com/2021/08/03/ruby-adds-integer-try-convert
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Ruby 3.1 adds try_convert method to Integer class for implicit conversions

Aug 3, 2021 , by Jijo Bose 1 minute read

Implicit and Explicit Conversion

Ruby objects are usually converted to other classes/types using to_* functions. For example, converting the string “42” to an integer is done with to_i.

The following table shows the defined conversion methods of Ruby’s important core classes:

Class Explicit Conversion Implicit Conversion Array to_a to_ary Hash to_h to_hash String to_s to_str Integer to_i to_int Float to_f - Complex to_c - Rational to_r - Regexp - to_regexp IO - to_io

Before

Some of Ruby’s core classes like String, Array, Hash, Regexp has a try_convert class method, but it was missing in the case of Integer.

After

Starting with Ruby 3.1 try_convert method is added to Integer class. It converts the argument by to_int method without explicit conversions like Integer().

try_convert method converts the object into an instance of the Integer class using the implicit conversion method to_int. If no implicit conversion method is defined, it returns nil. It also returns nil, if the result of the conversion is nil, or nil was passed as an argument.

Below is an example of how the try_convert method can be used in the Integer

x = 42
Integer.try_convert(x) # 42

# returns the argument if it's an Integer
x = "42"
Integer.try_convert(x) # nil

# returns nil when the argument does not respond to to_int
obj = Object.new

# sends to_int to the argument and raises TypeError if it's not a kind of Integer
Integer.try_convert(obj)
#=> TypeError: can't convert Object to Integer

obj = Object.new

# explicit conversion using to_i
def obj.to_i
  1
end

# returns nil because `to_i` performs explicit conversion.
Integer.try_convert(obj)
#=> nil

obj = Object.new

# implicit conversion using to_int
def obj.to_int
  1
end

# returns 1 because `to_int` performs implicit conversion.
Integer.try_convert(obj)
#=> 1

obj = Object.new

# implicit conversion using to_int, but we are not returning an integer.
def obj.to_int
  Object.new
end

Integer.try_convert(obj)
#=> TypeError: can't convert Object to Integer
# Raises as error, as return type is not an integer.

When to Use What?

  • Use to_* methods for explicit conversion.
  • Use .try_convert for implicit conversion.

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK