String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
これら2つの強制変換方法に違いはありますか?もしそうなら、あなたはデモンストレーションできますか?Rubyでは、String()と#to_sの違いは何ですか?
String(1.1) == (1.1).to_s => true
String(1.1) === (1.1).to_s => true
これら2つの強制変換方法に違いはありますか?もしそうなら、あなたはデモンストレーションできますか?Rubyでは、String()と#to_sの違いは何ですか?
はdocs for the String
methodは言う:
は、引数を変換そのto_sメソッドを呼び出すことによってStringに変換します。
一般的には同じですが、いくつかの違いがあります。実際には見えないかもしれませんが、 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>
ニースのデモンストレーション! –