+类上的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

最佳答案

我怀疑您在解析数字文字的方式中看到了解析器行为的副作用。

如果我们创建自己的类:

class C
  def +@
    11
  end
end

然后看一些东西:
> c = C.new
> +c
 => 11
> ++c
 => 11

这正是我们期望发生的事情。如果我们使用您的Fixnum一元+覆盖和Fixnum变量:
> n = 23
> +n
 => 15
> ++n
 => 15

然后我们再次看到您的期望。在这两种情况下,我们都看到在非文字上调用+@方法的结果。

但是,当我们在您的运算符(operator)就位的情况下查看+6时:
> +6
 => 6

不会调用+@方法。同样,如果我们重写-@:
class Fixnum
  def -@
    'pancakes'
  end
end

并查看其作用:
> -42
 => 42

那么这是怎么回事?好吧,Ruby看到的+6-42不是作为6.send(:+@)42.send(:-@)方法调用,而是作为正6和负42的单个文字。

如果您开始添加括号+(6)-(42),那么Ruby会看到非文字表达式并最终调用一元方法。同样,当您将一元运算符加倍时。

关于ruby - 一元运算符的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22085607/

10-11 04:16