文字列に数値をそのまま+で足したときのエラーです。to_sや式展開で解決します。nilやSymbolが混ざったとき、数値演算の右辺に文字列を置いたときも同じ系統のエラーになります。
+ で連結しているage = 20
puts "私は" + age + "歳"
age = 20
puts "私は" + age.to_s + "歳"
# 式展開ならさらに簡単
puts "私は#{age}歳"
▶ 修正済みコードを実行エディタで開く
数値を文字列に足すときはto_sで文字列化します。より簡潔なのは式展開"#{age}"で、型を意識せず埋め込めます。逆に文字列を数値化するにはto_iやto_fを使います。
末尾の文言で「どちらの型に合わせればいいか」が変わります。左辺(受け手)の型に右辺を合わせるのが基本です。
| メッセージ | 原因 | 直し方 |
|---|---|---|
no implicit conversion of Integer into String | 文字列に数値を + 連結した | 数値側に .to_s、または式展開 "#{n}" |
no implicit conversion of nil into String | nil を文字列連結した(キー無し・戻り値なし) | 原因の変数を p で確認し to_s か "#{v}" |
String can't be coerced into Integer | 数値演算の右辺に文字列(1 + "2"、getsの戻り) | 右辺に .to_i / .to_f |
nil can't be coerced into Integer | 数値演算の右辺が nil(初期化漏れ) | x ||= 0 や x.to_i で 0 埋め |
no implicit conversion of Symbol into String | :name のようなシンボルを連結した | .to_s(:name.to_s → "name") |
no implicit conversion of String into Array | 配列に文字列を + した | arr << str か arr.join(", ") |
comparison of Integer with String failed | 比較・sort・min/maxで型が混在 | map(&:to_i) で揃えてから比較 |
この2つはどちら側の型が主役かが逆です。ここを取り違えると直す場所を間違えます。
Bが欲しい場所にAが来た」。String#+ や puts の連結、File.join などで発生。左辺(B)に合わせて A を変換する。Bの演算メソッド(+ - * /)の引数にAが来た」。1 + "2" や total + gets で発生。右辺(A)を数値に変換する。user = {name: "Sato"}
puts "年齢: " + user[:age] # user[:age] は nil
# → no implicit conversion of nil into String
OK
user = {name: "Sato"}
puts "年齢: #{user[:age]}" # nil は空文字として埋まる
puts "年齢: " + (user[:age] || "不明").to_s
ハッシュ・配列の存在しない要素、find や正規表現マッチの失敗、値を返さないメソッドはすべてnilを返します。まずp 変数で中身を確認してください。
print "数を入力: "
n = gets # 文字列(末尾に改行も付く)
puts n * 2 # "5\n5\n" になる/数値演算では coerced エラー
OK
print "数を入力: "
n = gets.to_i
puts n * 2
▶ to_i を使った例を実行エディタで開く
TypeError: can only concatenate str (not "int") to str。str() か f文字列で揃える。"1" + 2 === "12" と暗黙変換される。意図しない文字列連結に注意。TypeError。