可能重复 String concatenation in Rails 3
我使用的是Ruby 2.0.0-p247。
当你不小心空格时, +@
和-@
会导致NoMethodError
。
如果您使用+
和-
添加字符串,您会看到NoMethodError
pry> +""
NoMethodError: undefined method `+@' for "\n":String
pry> -""
NoMethodError: undefined method `-@' for "\n":String
更多错误示例:
1
pry> x + "\n"
NameError: undefined local variable or method `x' for main:Object
pry> x +"\n"
NoMethodError: undefined method `+@' for "\n":String
2
pry> def x
pry> def x; 1; end
pry> x +"\n"
NoMethodError: undefined method `+@' for "\n":String
3
pry> class X
pry> def y
pry> 1
pry> end
pry> end
=> nil
pry> x = X.new
=> #<X:0x00000100ce48b0>
pry> x.y +"\n"
NoMethodError: undefined method `+@' for "\n":String
我发现有一些名为TkVariable
但这与TkVariable无关。
这大约是+
优先级。有人在使用String时解释+
吗?
谢谢!
答案 0 :(得分:5)
Ruby中的+ @和 - @是什么?
这些是unary plus
和unary minus
。但这些都没有为String
个对象定义,而是为Fixnum
个对象定义。
请参阅以下内容:
2.respond_to?(:+@)
# => true
2.respond_to?(:-@)
# => true
"".respond_to?(:+@)
# => false
"".respond_to?(:-@)
# => false
我很困惑为什么+没有先与左侧相结合。
这是因为一元运算符比二元运算符具有higher precedence
。
class X
def y
"1"
end
end
x = X.new
x.y +"b" # undefined method `+@' for "b":String (NoMethodError) <~~ A
x.y + "b" # => "1b" <~~ B
如果发生错误,则String#+@
未定义,但在案例B中,String#+
已定义。此处x.y +"b"
此处+
是一元运算符,其中x.y + "b"
; +
是二元运算符。