隐式-显式类型转换


显式的类型转换我们都知道,比如to_a、to_s、to_i方法,显示转化一般用于这样的情形:源类型和目标类型很大程度上不相关或毫无关联

那么,隐式类型转换是什么呢? 隐式类型转换适用于源类型和目标类型很详尽的情形

ruby核心库和标准库大量使用了隐式类型转换,标准类型转换方法如下:

注:隐式、显式方法目标类都已实现

方法 目标类型 转换形式 备注
#to_a Array 显式
#to_ary Array 隐式
#to_c Complex 显式
#to_enum Enumerator 显式
#to_h Hash 显式 ruby2.0开始引入
#to_hash Hash 隐式
#to_i Integer 显式
#to_int Integer 隐式
#to_io IO 隐式
#to_open IO 隐式 在IO.open中会用到
#to_path String 隐式
#to_proc Proc 隐式
#to_r Rational 隐式
#to_regexp Regexp 隐式 在Regexp.try_convert中被用到
#to_s String 显式
#to_str String 隐式
#to_sym Symbol 隐式

有了这些方法,我们的有些参数检查就不必使用,可以使用隐式方法代替参数检查 eg

key = key.to_sym #非String、Symbol就会报错
params[key]

i = i.to_int#非integer就会报错
[1,2,34][i] 

一些首字母大写的强制类型转换方法会调用 这些隐式转换方法,如:Array(),Integer(),String()等,但是这些方法处理逻辑并不一致,有的会有限调用隐式方法、无隐式方法时再调用显式方法,有的是直接调用显式方法;具体情况还要看ruby官网文档 eg:

class B
    def to_ary
        [1,2,3]
    end

   def to_int
      88888
   end

  def to_str
      'abcdefg'
  end
end

Array(B.new) == [1,2,3]
Integer(B.new) == 88888
String(B.new) == 'abcdefg'  #(优雅的ruby说这个只是调用to_s,但实际是调用to_str)