String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
這兩個強制方法有什麼不同嗎?如果是這樣,你能證明嗎?在Ruby中,String()和#to_s之間的區別是什麼
String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
這兩個強制方法有什麼不同嗎?如果是這樣,你能證明嗎?在Ruby中,String()和#to_s之間的區別是什麼
Arg轉變通過調用其to_s方法將其轉換爲字符串。
所以一般他們是一樣的,但也有一些差異 - 儘管你不可能真正看到它們。 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
一樣的,但它可能是知道發生了什麼事情有用。
字符串(對象)是在對象上
他們提高不同的異常時,他們無法調用#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>
不錯的示範! –