Ruby 猴子修补Fixnum和Bignum,无重复

Ruby 猴子修补Fixnum和Bignum,无重复,ruby,monkeypatching,Ruby,Monkeypatching,我添加了两个用于处理数字的小助手,但我发现我必须复制粘贴我的方法,以使其同时处理Bignum和Fixnum。如果没有这样的复制粘贴,如何为这两个数字类编写方法 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

我添加了两个用于处理数字的小助手,但我发现我必须复制粘贴我的方法,以使其同时处理
Bignum
Fixnum
。如果没有这样的复制粘贴,如何为这两个数字类编写方法

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
这两个类都继承自。Monkeypatch,如果你想影响两者。从文档中:

整数 这个类是包含整数的两个具体类的基础,
Bignum
Fixnum

您可以使用集合交集查找这两个的公共类和模块:

Fixnum.ancestors & Bignum.ancestors
#=> [Integer, Numeric, Comparable, Object, Kernel, BasicObject] 

对于两个(或更多)类不共享适当的公共模块或类的情况,您也可以这样做:

module MyExtension
  def palindrome?
    ...
  end
end

class NumbaOne
  include MyExtension
end

class NumbaTwo
  include MyExtension
end
或者,如果您不想修改整个类,而只想修改某些实例:

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

[a1,a2,b1].each{ |o| o.extend MyExtension }

享受欧拉计划的乐趣。;)如果最常见的祖先不是类呢?(例如
Array.祖先和Range.祖先
->
可枚举
)@Caridorc您可以使用
Array.祖先.grep(Class)
选择类
a1 = NumbaOne.new
a2 = NumbaOne.new
b1 = NumbaTwo.new

[a1,a2,b1].each{ |o| o.extend MyExtension }