Rubyのアルゴリズム問題などで良く見かける文字列を繰り返し処理したい時、
String can\’t be coerced into Integer
のエラーが出て困った人はいないだろうか。
そんな初心者あるあるエラーを解説していきます。
TypeError (String can\’t be coerced into Integer)って。。。
文字列を繰り返し処理したい(成功)
入力された文字列を複数回連続で表示させたい。というアルゴリズム問題が発生した時、以下の順番だと上手くいきます。
input_str = gets.chomp.to_s
# 今回はdogを入力
input_num = gets.chomp.to_i
# 今回は3を入力
puts input_str * input_num
=>dogdogdog
文字列を繰り返し処理したい(失敗)
しかし、以下の順番だと上手くいきません・・・
input_str = gets.chomp.to_s
# 今回はdogを入力
input_num = gets.chomp.to_i
# 今回は3を入力
puts input_num * input_str
=>TypeError (String can\'t be coerced into Integer)
※日本語訳すると、、、型違いです!文字列は整数に変換できません。
Stringクラスに用意されているメソッド とIntegerクラスに用意されている メソッドが異なるのが要因!
ここがわかりにくい点ナンバーワンなのですが、Rubyは組み込み系言語なので、それぞれのクラスに使えるメソッドが全て用意されています。
(自分で定義して使うこともできるけど。)
今回間違いやすいのが、同じ *(掛けるという四則演算子)でも
SrtingクラスとIntegerクラスの四則演算子で挙動が異なる
という点です!
Stringクラスのメソッド一覧(Ruby 2.5.1)
https://ruby-doc.org/core-2.5.1/String.html
Integerクラスの使えるメソッド一覧(Ruby 2.5.1)
https://ruby-doc.org/stdlib-2.5.1/libdoc/bigdecimal/rdoc/Integer.html
リンク先で見ていただければわかると思いますが、実は全く違うメソッドとして
定義されています。
Integerクラスの *メソッドは引数にInteger型のインスタンスを与えなければいけないところ、今回Stringクラスのインスタンスであるdogを渡してしまっているので、Integerクラスをくれよ!!と言われているのです。
結論
文字列の繰り返しは文字列を左に、繰り返したい数を右に書こう!
正直、プログラミングを始めたての人にはよく分からないかもしれません。(僕も勉強中です。)
しかし、今の所は文字列が左にして掛ける回数を右に置いておけばいいんだな!という理解で全然良いと思います!
なぜか上手く動かない時は内部実装まで見てみよう!
それでも気になるという方は内部実装の理解を見てみましょう!
幸いなことにRubyはオープンソースの言語なのでリファレンスが豊富です!
また、今後記事に記載する予定ですが、リフレクションと言われる内部実装を見るためのメソッドも豊富なので、どんどんデバッグして理解を深めるという方法も非常に有効です。