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 }