3

今日、私の Rails アプリでこのエラーが発生し始めました。コードのコンテキストは次のとおりです。で始まる行でエラーをスローしていますnew_host_id

while @host_ids.include?(new_host_id)
  i++
  new_host_id = duplicate_host_id + i.to_s
end
4

3 に答える 3

8

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 は++iandi++をプロダクション+(+i)and [大まかに] i+(+)..

于 2012-07-16T21:31:21.923 に答える
2

エラーは前の行が原因であることがわかりました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
于 2012-07-16T21:24:37.333 に答える
2

警告がオンになっている場合は、おそらくその行に関する警告が表示されます。

$VERBOSE = true
def foo
  i = 2
  i++
  j = 5
  j + i
end

warning: possibly useless use of + in void context
于 2012-07-16T23:10:02.987 に答える