一次扩展多个类

时间:2014-08-20 10:13:52

标签: ruby

我想在所有Ruby的数据对象类中共享一个方法。也就是说以下类:

  • 哈希
  • 字符串
  • 阵列

首先,我错过了哪些课程?

其次,如何在所有课程中同时分享my_method

class Hash
    def my_method
       "hi"
    end
end

class String
    def my_method
       "hi"
    end
end

class Number
    def my_method
       "hi"
    end
end

class Array
    def my_method
       "hi"
    end
end

1 个答案:

答案 0 :(得分:4)

这是模块的用途:

module MyModule
  def my_method
   "hi"
  end
end

class Hash
  include MyModule
 end

class String
  include MyModule
end

...

你也可以通过一些元编程来缩短它:

[Hash, String, Number, Array].each do |klass|
  klass.instance_eval do
    include MyModule
  end
end

在较新的ruby版本中(因为ruby 2.1.0),include不再是私有方法,因此您可以将上述内容简化为:

[Hash, String, Number, Array].each do |klass|
  klass.include MyModule
end

实现此目的的另一种方法是将其包含在父类中,如Object:

class Object
  def my_method
   "hi"
  end 
end

{}.my_method

然而,这会将此方法添加到所有类中,并且随处可用,所以要小心。

关于你是否错过了任何课程 - 你错过了它的音调,这完全取决于你在这里想要实现的目标。