显式的类型转换我们都知道,比如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)
网友评论