如何重写Ruby +方法?

时间:2018-09-29 08:20:57

标签: ruby

仅出于学习目的,我试图覆盖Ruby +方法,但未获得所需的输出。

class Integer
  def +(my_num)
    "Plus method overridden"
  end
end

puts 5.+(9)

请让我知道我在这里做错了。

2 个答案:

答案 0 :(得分:4)

似乎您使用的是ruby <2.4。如果是这样,则您要修补Fixnum而不是Integer。请注意,系统本身也会使用数字。

class Fixnum
  alias_method :add, :+

  def +(other)
    puts 'plus method overridden'
    add(other)
  end
end

puts 5 + 9

答案 1 :(得分:0)

Ruby Language Specification允许Integer具有特定于实现的子类。参见15.2.8.1,第27-33行。

看起来您的实现确实具有此类子类。在这种情况下,+方法可能会在子类中被覆盖。

我最好的猜测是,您有一个区分FixnumBignum的实现,而我们的Integer#+Fixnum#+覆盖了。

顺便说一句,即使您试图做的事情奏效,也不会被覆盖覆盖,会被覆盖

还请注意,如果您尝试做的事情奏效了,则很有可能会破坏Ruby进程,因为Integer是Ruby的基础知识,在整个Ruby领域中广泛使用。