【问题标题】:In Ruby, what's the difference between String() and #to_s在 Ruby 中,String() 和 #to_s 有什么区别
【发布时间】:2012-11-02 07:06:14
【问题描述】:
String(1.1) == (1.1).to_s    => true
String(1.1) === (1.1).to_s   => true

这两种强制方法有区别吗?如果可以,你能证明一下吗?

【问题讨论】:

    标签: ruby coding-style


    【解决方案1】:

    String(object) 是一个在对象上调用#to_s 的内核方法

    【讨论】:

      【解决方案2】:

      它们在失败时会引发不同的异常:

      bo = BasicObject.new
      
      String(bo)
      TypeError: can't convert BasicObject into String
      
      bo.to_s
      NoMethodError: undefined method `to_s' for #<BasicObject:0x0003efbfd79c10>
      

      【讨论】:

        【解决方案3】:

        docs for the String method 说:

        通过调用其 to_s 方法将 arg 转换为字符串。

        因此,它们通常是相同的,但也存在一些差异——尽管您不太可能真正看到它们。 String() 检查其参数的类,如果它还不是 String,则在其上调用 to_s。直接调用to_s表示方法不管调用。

        考虑类:

        class MyString < String
          def to_s
            "Overridden to_s method"
          end
        end
        

        MyString 的实例已经是 String 对象,因此将其作为参数传递给 String() 不会做任何事情。但是,在其上调用 to_s 将返回 Overridden to_s method

        1.9.3p286 :010 > m = MyString.new 'my string'
         => "my string" 
        1.9.3p286 :011 > o = String.new 'orig string'
         => "orig string" 
        1.9.3p286 :012 > String o
         => "orig string" 
        1.9.3p286 :013 > String m
         => "my string" 
        1.9.3p286 :014 > o.to_s
         => "orig string" 
        1.9.3p286 :015 > m.to_s
         => "Overridden to_s method" 
        

        您不太可能需要像这样在 String 子类上覆盖 to_s,通常您可以将 String()to_s 视为相同,但了解发生了什么可能会很有用.

        【讨论】:

        • RE 覆盖 #to_s:从 Ruby 2.0.0 开始,文档阐明了这种行为:“首先尝试调用其 to_str 方法,然后调用其 to_s 方法。”。这就是为什么覆盖 #to_s 没有效果的原因——因为 Ruby 首先在 MyString 对象上调用 .to_str,而在上面的示例中该对象没有被覆盖。
        猜你喜欢
        • 1970-01-01
        • 2012-09-22
        • 2016-11-09
        • 2016-03-26
        • 2012-08-11
        • 2018-06-07
        • 2012-10-06
        • 2021-12-21
        • 2012-05-21
        相关资源
        最近更新 更多