2012-11-13 20 views

risposta

12

Il docs for the String method dicono:

Converte arg a una stringa chiamando il suo metodo to_s.

Quindi in genere sono uguali, ma ci sono alcune differenze - anche se è improbabile vederli per davvero. String() controlla la classe del suo parametro e, se non è già un String, chiama lo to_s su di esso. Chiamare direttamente to_s significa che il metodo viene chiamato a prescindere.

considera la categoria:

class MyString < String 
    def to_s 
    "Overridden to_s method" 
    end 
end 

Un'istanza di MyString è già un oggetto String, quindi passando come parametro per String() non farà nulla. Se si chiama to_s, verrà restituito 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" 

è improbabile mai avere bisogno di ignorare to_s su un String sottoclasse come questo, in generale, è possibile trattare String() e to_s come lo stesso, ma potrebbe essere utile sapere cosa sta succedendo.

+0

Bella dimostrazione! –

2

String (oggetto) è un metodo Kernel che chiama #to_s sull'oggetto

3

Alzano diverse eccezioni quando falliscono:

bo = BasicObject.new 

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

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