それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ruby の暗黙的文字列変換 toString 的なものをするには

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 暗黙的

参考資料

http://qiita.com/tbpgr/items/19b42765a7b9cb292f44