猴子修补Fixnum和Bignum没有重复

Car*_*orc 2 ruby monkeypatching

我已经添加了两个小帮手与数字打交道,但是我发现,我不得不复制粘贴我的方法,使其与工作都BignumFixnum.如何在没有这种复制粘贴的情况下为这两个数字类编写方法?

class Bignum
    def digits
        self.to_s.split('').map(&:to_i)
    end

    def palindrome?
        self.to_s == self.to_s.reverse
    end
end

class Fixnum
    def digits
        self.to_s.split('').map(&:to_i)
    end

    def palindrome?
        self.to_s == self.to_s.reverse
    end
end
Run Code Online (Sandbox Code Playgroud)

Phr*_*ogz 5

这两个类都继承自Integer.Monkeypatch,如果你想影响两者.来自文档:

整数

这个类是包含整数的两个具体类的基础,BignumFixnum.

2.0.0-p353 :001 > class Integer; def worked?; true; end; end
#=> nil 
2.0.0-p353 :002 > 42.worked?
#=> true 
2.0.0-p353 :003 > 42.class
#=> Fixnum 
2.0.0-p353 :004 > big = 2**90
#=> 1237940039285380274899124224 
2.0.0-p353 :005 > big.worked?
#=> true 
2.0.0-p353 :006 > big.class
#=> Bignum 
Run Code Online (Sandbox Code Playgroud)

您可以使用set intersection找到两者的公共类和模块:

Fixnum.ancestors & Bignum.ancestors
#=> [Integer, Numeric, Comparable, Object, Kernel, BasicObject] 
Run Code Online (Sandbox Code Playgroud)

对于两个类(或更多)不共享适当的公共模块或类的情况,您可以选择执行以下操作:

module MyExtension
  def palindrome?
    ...
  end
end

class NumbaOne
  include MyExtension
end

class NumbaTwo
  include MyExtension
end
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想修改整个类,只需要修改某些实例:

a1 = NumbaOne.new
a2 = NumbaOne.new
b1 = NumbaTwo.new

[a1,a2,b1].each{ |o| o.extend MyExtension }
Run Code Online (Sandbox Code Playgroud)