一元运算符的行为

JKi*_*ian 5 ruby operator-overloading operators

当在类中重新定义+Ruby中的一元运算符时,会产生一些奇怪的结果Fixnum.不确定为什么事情发生的方式(特别是线路009).

irb:003> class Fixnum
irb:004>   def +@ #define unary +
irb:005>     15
irb:006>   end
irb:007> end
=> nil
irb:008> 2
=> 2
irb:009> +2
=> 2
irb:010> +(2)
=> 15
irb:011> ++2
=> 15
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

我怀疑你看到解析器行为在解释数字文字方面的副作用.

如果我们创建自己的类:

class C
  def +@
    11
  end
end
Run Code Online (Sandbox Code Playgroud)

然后看一些事情:

> c = C.new
> +c
 => 11 
> ++c
 => 11 
Run Code Online (Sandbox Code Playgroud)

这正是我们期望发生的事情.如果我们使用你的Fixnum一元+覆盖和一个Fixnum变量:

> n = 23
> +n
 => 15 
> ++n
 => 15 
Run Code Online (Sandbox Code Playgroud)

然后我们再次看到你所期待的.在这两种情况下,我们都会看到在+@非文字上调用方法的结果.

但是,当我们+6与您的运营商联系时:

> +6
 => 6 
Run Code Online (Sandbox Code Playgroud)

+@方法未被调用.同样,如果我们覆盖-@:

class Fixnum
  def -@
    'pancakes'
  end
end
Run Code Online (Sandbox Code Playgroud)

看看它做了什么:

> -42
 => 42
Run Code Online (Sandbox Code Playgroud)

那么这里发生了什么?那么,红宝石是看到+6-42没有6.send(:+@)42.send(:-@)方法调用,但作为单一文字正六负42.

如果你开始添加括号,+(6)并且-(42),然后红宝石看到非文字表达和结束调用一元的方法.同样当你将一元运算符加倍时.