在 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
然后我们再次看到您的期望。在这两种情况下,我们都会看到对非文字调用 +@
方法的结果。
但是当我们查看 +6
并且您的运算符(operator)就位时:
> +6
=> 6
+@
方法没有被调用。同样,如果我们覆盖 -@
:
class Fixnum
def -@
'pancakes'
end
end
看看它做了什么:
> -42
=> 42
那么这里发生了什么?好吧,Ruby 看到的是 +6
和 -42
而不是 6.send(:+@)
和 42.send(: -@)
方法调用,但作为正六和负四十二的单个文字。
如果您开始添加括号 +(6)
和 -(42)
,那么 Ruby 会看到非文字表达式并最终调用一元方法。同样,当您将一元运算符加倍时。
关于ruby - 一元运算符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085607/