什么 - @和+ @导致String的NoMethodError

时间:2013-08-09 16:34:34

标签: ruby

可能重复 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时解释+吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

  

Ruby中的+ @和 - @是什么?

这些是unary plusunary 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"; +是二元运算符。