NoMethodError:未定义的方法`+ @'表示“some sting”:String

时间:2012-07-16 21:24:37

标签: ruby

我的rails应用程序今天才开始收到此错误。这是代码上下文。它将错误放在以new_host_id

开头的行上
while @host_ids.include?(new_host_id)
  i++
  new_host_id = duplicate_host_id + i.to_s
end

3 个答案:

答案 0 :(得分:8)

Ruby 没有<{1}}运算符。

Ruby中的成语是++,它是i += 1的缩写形式。


最初我认为发布的代码不正确,必须i = i + 1才能生成该错误。但是,正如JörgWMittag在评论中解释的那样,情况并非如此:

  

[..] Ruby允许运算符和操作数之间的空格(包括换行符),因此整个事物被解释为++i [..这就是为什么NoMethodError引用String。

这是一个显示问题的简化示例(发布的代码引用第一种情况):

> x = "hello"
> +x
undefined method `+@' for "hello":String (NoMethodError)
> x+
syntax error, unexpected $end

我使用上面的i + (+(new_host_id = duplicate_host_id + i.to_s))而不是+来简化示例:Ruby将++++i视为制作i++和[粗略] {{ 1}} ..

答案 1 :(得分: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

答案 2 :(得分:2)

如果你有警告,你可能会收到有关该行的警告。

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

warning: possibly useless use of + in void context