ruby って to_s が自動的に呼ばれない。
たとえば、Hashと文字列を結合しようとした時
h = { name:'takuya' } str = 'this obj is ' + h puts str
Hash を String にする方法がないからエラー
takuya@~/Desktop$ ruby test.rb test.rb:5:in `+': no implicit conversion of Hash into String (TypeError) from test.rb:5:in `<main>'
他の言語では?
Java とかだと、toString 定義しておけば読んでくれるじゃん?
class Man { public String toString(){ return " I'm man "; } } public class Main{ public static void main(String[] args){ Man m = new Man(); String s = "Hello "+ m; System.out.println( s ); } }
こういう、暗黙的な型変換を呼び出すにはどうするのか
to_s ではなく to_str を使う
to_str を使うと、目的を達成することが出来る。
よく見るとエラーメッセージもno implicit conversion(暗黙的変換がない)
と言ってる
to_str を追加する
h = { name:'takuya' } def h.to_str self.to_s end str = 'this obj is ' + h puts str
実行結果
takuya@~/Desktop$ ruby test.rb this obj is {:name=>"takuya"}
何でこんなことになってるのか。
コーディングにおける意図しない変換
を防ぐためだと。
たとえば、数字だって、暗黙的変換がないので、明示的に to_s する必要がある。
'this is ' + 1 + ' th place my family traveled' ## ダメ 'this is ' + 1.to_s + ' th place my family traveled' ## おっけ
そういえば、明示的にto_s つけるか、#{number}で埋め込んでたわ。
Javaって暗黙型変換が便利なようで実は不便だからな。Rubyはこういう変なところで厳格な言語だよね。
ちなみに、覚えておくべき英語は次の通り。
- explicit 明示的
- implicit 暗黙的