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

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

4

3 回答 3

16

方法的文档String说:

通过调用其 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视为相同,但了解正在发生的事情可能很有用。

于 2012-11-13T21:25:03.540 回答
5

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

bo = BasicObject.new

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

bo.to_s
NoMethodError: undefined method `to_s' for #<BasicObject:0x0003efbfd79c10>
于 2012-11-13T20:30:51.747 回答
2

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

于 2012-11-13T20:14:21.000 回答