我无法理解为什么这不起作用;所有三个元素都应该是字符串。
i = 5
base = "somestring"
base = i.to_s +" #{base} " + i.to_s # => Undefined method '+@'
为什么将其解释为方法?我想也许它与将base
设置为等于其自身的一部分有关,但这似乎有效:
base = "#{base}"
答案 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
^