Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 一次扩展多个类_Ruby - Fatal编程技术网

Ruby 一次扩展多个类

Ruby 一次扩展多个类,ruby,Ruby,我想在所有Ruby的数据对象类中共享一个方法。也就是说,以下类别: 散列 串 数 排列 首先,我错过了什么课程 其次,我如何在所有类中同时共享我的_方法 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

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

  • 散列
  • 排列
首先,我错过了什么课程

其次,我如何在所有类中同时共享
我的_方法

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

这就是模块的用途:

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
实现这一点的另一种方法是将其包含在父类中,如对象:

class Object
  def my_method
   "hi"
  end 
end

{}.my_method
但是,这会将此方法添加到所有类中,并且在任何地方都可用,因此请小心


关于你是否错过了任何课程——你错过了它的音调,这完全取决于你在这里真正想要达到的目标。

这就是模块的用途:

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
实现这一点的另一种方法是将其包含在父类中,如对象:

class Object
  def my_method
   "hi"
  end 
end

{}.my_method
但是,这会将此方法添加到所有类中,并且在任何地方都可用,因此请小心


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

你不需要重新打开任何课程或使用
instance\u eval
-你可以只做
Hash.include MyModule
@matt-
include
是类私有方法,至少在ruby 1.9.3和ruby 2.0.0中,我更喜欢打开类而不是调用send。在ruby 2.1.1中,include是公共方法,需要扫描变更日志。找到它:和。清除,完整的答案。好的!我认为
Number
应该是
Numeric
。即使对于Ruby版本<2.1,也不需要元编程:
klass.send(:include,MyModule)
。您不需要重新打开任何类或使用
实例评估
-您只需执行例如
散列即可。include MyModule
@matt-
include
是类私有方法,至少在ruby 1.9.3和ruby 2.0.0中是这样,我更喜欢打开类而不是调用send。在ruby 2.1.1中,include是公共方法,需要扫描变更日志。找到它:和。清除,完整的答案。好的!我认为
Number
应该是
Numeric
。即使对于Ruby版本<2.1,您也不需要元编程:
klass.send(:include,MyModule)
。您拼错了一个类名(
Numeric
)。:-)您拼错了其中一个类名(
Numeric
)。:-)