ホーム › エラー解決 › Ruby › TypeError(String変換)
Ruby ERROR

Ruby TypeError: no implicit conversion の解決法

文字列に数値をそのまま+で足したときのエラーです。to_sや式展開で解決します。nilやSymbolが混ざったとき、数値演算の右辺に文字列を置いたときも同じ系統のエラーになります。

このエラーメッセージ

TypeError: no implicit conversion of Integer into String

原因

❌ エラーになるコード

NG
age = 20
puts "私は" + age + "歳"

✅ 修正したコード

OK
age = 20
puts "私は" + age.to_s + "歳"
# 式展開ならさらに簡単
puts "私は#{age}歳"
▶ 修正済みコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。

解決のポイント

数値を文字列に足すときはto_sで文字列化します。より簡潔なのは式展開"#{age}"で、型を意識せず埋め込めます。逆に文字列を数値化するにはto_iやto_fを使います。

メッセージ別・原因早見表

末尾の文言で「どちらの型に合わせればいいか」が変わります。左辺(受け手)の型に右辺を合わせるのが基本です。

メッセージ原因直し方
no implicit conversion of Integer into String文字列に数値を + 連結した数値側に .to_s、または式展開 "#{n}"
no implicit conversion of nil into Stringnil を文字列連結した(キー無し・戻り値なし)原因の変数を 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) で揃えてから比較

「no implicit conversion」と「can't be coerced into」の違い

この2つはどちら側の型が主役かが逆です。ここを取り違えると直す場所を間違えます。

❌ nil が混ざるケース

NG
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 変数で中身を確認してください。

❌ 入力値を計算するケース

NG
print "数を入力: "
n = gets            # 文字列(末尾に改行も付く)
puts n * 2          # "5\n5\n" になる/数値演算では coerced エラー
OK
print "数を入力: "
n = gets.to_i
puts n * 2
▶ to_i を使った例を実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。

他言語の似たエラー

よくある質問

to_sと式展開どちらがいい?
可読性の高い式展開が一般的です。"私は#{age}歳" のように書けば型を気にせず埋め込めます。
数値同士の連結は?
1.to_s + 2.to_s のように文字列化するか、"#{1}#{2}" とします。数値のまま + すると加算になります。
no implicit conversion と can't be coerced into の違いは?
前者は「文字列などが期待される場所に数値を渡した」、後者は「数値演算の右辺に数値でないものを置いた」です。前者は左辺、後者は右辺の型に合わせて変換します。
no implicit conversion of nil into String が出ます
nil を文字列連結しています。存在しないハッシュキー、gets の EOF、戻り値のないメソッドが原因のことが多いです。p で中身を確認し "#{v}" か v.to_s を使います。
gets で受け取った数値を計算するとエラーになります
gets の戻り値は文字列です。gets.to_i / gets.to_f で数値化してから計算してください。
comparison of Integer with String failed は同じ原因?
仲間のエラーです。sort や min/max、比較演算子で型が混在しています。map(&:to_i) などで揃えてから比較します。
配列を puts したら結合でエラーになります
arr.join(", ") で文字列にしてから連結します。arr + "文字列" は no implicit conversion of String into Array になります。
Pythonの can only concatenate str と同じ?
考え方は同じです。Rubyは to_s / 式展開、Pythonは str() / f文字列で型を揃えます。