【发布时间】: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
String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
这两种强制方法有区别吗?如果可以,你能证明一下吗?
【问题讨论】:
标签: ruby coding-style
String(object) 是一个在对象上调用#to_s 的内核方法
【讨论】:
它们在失败时会引发不同的异常:
bo = BasicObject.new
String(bo)
TypeError: can't convert BasicObject into String
bo.to_s
NoMethodError: undefined method `to_s' for #<BasicObject:0x0003efbfd79c10>
【讨论】:
通过调用其 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 视为相同,但了解发生了什么可能会很有用.
【讨论】: