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