String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
C'è una differenza tra questi due metodi di coercizione? Se è così, puoi dimostrare?In Ruby, qual è la differenza tra String() e #to_s
String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
C'è una differenza tra questi due metodi di coercizione? Se è così, puoi dimostrare?In Ruby, qual è la differenza tra String() e #to_s
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.
String (oggetto) è un metodo Kernel che chiama #to_s sull'oggetto
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>
Bella dimostrazione! –