Ruby 一次扩展多个类
我想在所有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
- 散列
- 串
- 数
- 排列
我的_方法
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
)。:-)