2012-11-13 39 views

回答

12

docs for the String method說:

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一樣的,但它可能是知道發生了什麼事情有用。

+0

不錯的示範! –

2

字符串(對象)是在對象上

3

他們提高不同的異常時,他們無法調用#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> 
相關問題