为什么ruby将++解释为+ @

时间:2017-03-11 12:32:05

标签: ruby

我在irb中获得了bizzare输出

>> [1, 2] + + [3]
NoMethodError: undefined method `+@' for [3]:Array
    from (irb):2
    from /home/marko/.rubies/ruby-2.3.1/bin/irb:11:in `<main>'
>> [1, 2] ++ [3]
NoMethodError: undefined method `+@' for [3]:Array
    from (irb):3
    from /home/marko/.rubies/ruby-2.3.1/bin/irb:11:in `<main>'
>> 

这是故意发生还是错误? 将+ +转换为+@

背后的逻辑是什么?

3 个答案:

答案 0 :(得分:9)

它没有将+ +转换为+@,而是将后者+转换为+@,即前缀+运算符。因此,表达式的解析与[1, 2] + (+[3])相同。

+@用于表示一元加运算符,因为+是为二元加运算符保留的。)

(另外,Ruby中没有++运算符。)

答案 1 :(得分:3)

我相信这被解析为:

[1, 2] + +[3]

错误是Ruby告诉我们没有正数组的概念。

你可以用整数看到这个。例如:

1++2  # => 3
# parsed as 1 + +2
# (obviously this is a particularly bad way to write this expression - don't do it!)

答案 2 :(得分:0)

根据这个答案No increment operator (++) in Ruby? Ruby没有增量运算符,所以最好将+ +解释为两个独立的运算符,从而导致意外行为。如

  

++和 - 在Ruby中不是保留的运算符[s]

在尝试此操作时,Ruby gem或其他包含的库可能会导致其他意外行为。另外值得注意的是+++ +,在非白空间敏感语言(如Ruby)中功能相同的事情将无法解析{{1}的任何可能的单独操作运营商。

简而言之: Ruby 不会将+解释为+ +,它只会将其解释为两个独立的+@运算符。