今日、私の Rails アプリでこのエラーが発生し始めました。コードのコンテキストは次のとおりです。で始まる行でエラーをスローしていますnew_host_id
while @host_ids.include?(new_host_id)
i++
new_host_id = duplicate_host_id + i.to_s
end
今日、私の Rails アプリでこのエラーが発生し始めました。コードのコンテキストは次のとおりです。で始まる行でエラーをスローしていますnew_host_id
while @host_ids.include?(new_host_id)
i++
new_host_id = duplicate_host_id + i.to_s
end
Rubyには演算子がありません。++
Ruby のイディオムは でi += 1
、これは の省略形ですi = i + 1
。
最初は、投稿されたコードが間違っていて、++i
そのエラーを生成する必要があると思っていました。ただし、Jörg W Mittag がコメントで説明しているように、そうではありません。
[..] Ruby では、演算子とオペランドの間に空白 (改行を含む) を使用できるため、全体が
i + (+(new_host_id = duplicate_host_id + i.to_s))
[.. として解釈されます。これが、NoMethodError が String を参照する理由です。
問題を示す簡単な例を次に示します (投稿されたコードは最初のケースを参照しています)。
> x = "こんにちは" > +x 「hello」の未定義メソッド `+@':String (NoMethodError) >×+ 構文エラー、予期しない $end
+
上記の例を単純化するためにand notを使用し++
ました。Ruby は++i
andi++
をプロダクション+(+i)
and [大まかに] i+(+)
..
エラーは前の行が原因であることがわかりましたi++
に変更i++
しi = i + 1
、現在は機能しています。
これが作業コードです
while @host_ids.include?(new_host_id)
i = i + 1
new_host_id = duplicate_host_id + i.to_s
end
警告がオンになっている場合は、おそらくその行に関する警告が表示されます。
$VERBOSE = true
def foo
i = 2
i++
j = 5
j + i
end
warning: possibly useless use of + in void context