在Ruby中,String()和#to_s之间有什么区别

时间:2012-11-13 19:55:37

标签: ruby coding-style

String(1.1) == (1.1).to_s    => true
String(1.1) === (1.1).to_s   => true

这两种强制方法之间有区别吗?如果是这样,你能证明吗?

3 个答案:

答案 0 :(得分:14)

docs for the String method说:

  

通过调用其to_s方法将arg转换为String。

所以一般来说它们都是一样的,但也存在一些差异 - 尽管你不太可能真实地看到它们。 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" 

您不太可能需要覆盖此类to_s子类上的String,通常您可以将String()to_s视为相同,但它可能有助于了解正在发生的事情。

答案 1 :(得分:3)

他们失败时会提出不同的例外:

bo = BasicObject.new

String(bo)
TypeError: can't convert BasicObject into String

bo.to_s
NoMethodError: undefined method `to_s' for #<BasicObject:0x0003efbfd79c10>

答案 2 :(得分:2)

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