美文网首页
隐式/显式类型转换

隐式/显式类型转换

作者: SecondRocker | 来源:发表于2020-06-27 15:30 被阅读0次

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

    相关文章

      网友评论

          本文标题:隐式/显式类型转换

          本文链接:https://www.haomeiwen.com/subject/mrzmfktx.html