2017-03-11 60 views
2

我在IRB为什么红宝石解释++的+ @

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

让输出的bizzare这是发生在目的或者是一个错误吗?
什么是它不转换成+ +背后[email protected]转换成+ +[email protected]

+4

在过去的一年中,453个SO问题的作者提出,原因不明的行为可能归因于Ruby中的错误。在这些案件的451名中,罪魁祸首被发现是更为平凡的东西。 –

+0

http://ruby-doc.org/core-2.4.0/Numeric.html#method-i-2B-40 –

回答

9

的逻辑,它的转换后+[email protected],即前缀+操作。因此表达式被解析为与[1, 2] + (+[3])相同。

[email protected]用来表示一元加号运算符,因为+保留为二进制加法运算。)

(此外,还有在Ruby中没有++操作。)

+1

为什么'+'与'+ @'相同? –

+4

因为'+'表示二元加运算符,而'+ @'表示一元(前缀)加运算符。 – emlai

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!) 
0

按照这个答案No increment operator (++) in Ruby? Ruby没有增量操作,所以充其量+ +将被解释为两个独立的运营,从而导致意外的行为。作为

++和 - 在Ruby中

它可能是在尝试此操作时,一个Ruby宝石或其它包含的库​​可能会导致其它意外行为不是保留操作[S]。另外值得注意的是+++ +,这在功能上与非空白敏感语言(如Ruby)中的功能相同,将无法解析对于两个+运算符都没有可能的单独操作。

简而言之:红宝石不解释+ +[email protected],它仅仅将其解释为两个独立的运营商+

+1

这是误导。首先:是的,Ruby *会将它解释为两个独立的运算符,但它将其解释为两个不同的运算符:二进制中缀+和一元前缀+。第二:与一元前缀'+'对应的消息被称为'+ @',所以,是的,Ruby *会将它解释为'+ @',具体为'[1,2]。+([3]。+ @())'。 –

+0

这是否始终如此,或仅仅在某些情况下?如果后者对我所提出的原始问题的回答是准确的并且不应该是误导性的,因为它涉及到从一个具体的例子而不是这个例子本身的泛化 - 虽然当然tuple_cat的答案来自于一个更有经验的开发者,级别的体验值得其赞赏,imo。 –