【问题标题】:what's -@ and +@ causes NoMethodError for String [duplicate]什么是 -@ 和 +@ 导致字符串的 NoMethodError [重复]
【发布时间】:2013-08-09 16:34:34
【问题描述】:

可能重复 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 一起使用时的含义吗?

谢谢!

【问题讨论】:

  • 你可以在这个网站上搜索时髦的符号 - 例如。尝试搜索 [ruby] "+@"。
  • 是的!但我想知道这两个字符串。在其他情况下,它是一元运算符。
  • 我不明白。 Ruby 告诉你它们不存在于字符串中。
  • 如果你想为x:x + "\n"连接一个“\n”但是你输入了一个错误并输入了x +"\n",那么就会出现这个错误。
  • @Babai 我很困惑为什么+ 不与左侧先结合。

标签: ruby


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2019-03-04
    相关资源
    最近更新 更多