未定义的方法'+ @'

时间:2014-05-27 00:43:07

标签: ruby

我无法理解为什么这不起作用;所有三个元素都应该是字符串。

i = 5
base = "somestring"
base = i.to_s +" #{base} " + i.to_s # => Undefined method '+@'

为什么将其解释为方法?我想也许它与将base设置为等于其自身的一部分有关,但这似乎有效:

base = "#{base}"

2 个答案:

答案 0 :(得分:9)

好问题!在ruby中,+@方法定义了一元+运算符的行为。换句话说,它定义了当您使用+someSymbol等表达式时会发生什么。

因此,在这种情况下,它会看到表达式的一部分+" #{base} "并尝试将unary +方法应用于不存在的字符串。

尝试在+和字符串开头之间添加空格。


有趣的是,这只会在某些情况下发生。

i = 2
i.to_s +"foo" # => NoMethodError: undefined method `+@` for "foo":String
"2" +"foo"    # => "2foo"

那是怎么回事? i.to_s +"foo"相当于i.to_s(+"foo")。现在你可以看到为什么要调用一元+函数而不是字符串连接运算符。


因此,您还有其他选择来修复您的代码:

i.to_s() +" #{base} " + i.to_s

甚至

"#{i} #{base} #{i}"

答案 1 :(得分:2)

+运算符周围添加空格。否则,它被视为一元+运算符:

i.to_s + "#{base} " + i.to_s
        ^