ruby - 一元运算符行为

标签 ruby operators operator-overloading

在 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/

相关文章:

Ruby:如何添加到数组的新哈希?

c++ - 不匹配 'operator+='(操作数类型为 'std::basic_ostream<char>' 和 'int')

c++ - 分配给在 C++ 中创建的对象

ios - Calabash 如何在 Ruby 方法中使用通配符?

ruby-on-rails - 数组连接函数 - Ruby on Rails

javascript - 按位不在 ruby 中

operators - OCaml 中的扫描和负整数文字

C++ 重载运算符 << 以处理指针 vector

c++ - 在 operator<< 中动态转换为派生类型

ruby - gitlab 通过 api 创建新用户会产生 404