ruby 中的几个 类 添加方法
Adding a method to several classes in ruby
我想给几个 class 添加一个方法。但是我遗漏了一些我不知道如何称呼它的东西所以我无法搜索它
我想做类似的事情
["Class1", "Class2"].each do |klass|
class klass.constantize
def my_new_method
....
end
end
end
显然代码不起作用,但您明白了。如何使 klass 成为 class 名称以便我可以声明该方法?
使用const_get
and class_eval
:
class A;
def a;
puts :a;
end;
end
Kernel.const_get("A").class_eval { def b; puts :b; end }
pry(main)> A.new.b
b
=> nil
将功能添加到多个 classes 通常是使用 mixins。 Module#prepend
是你的朋友。这样,如果方法 覆盖 扩展 class.
中的现有方法,就可以调用 super
["Class1", "Class2"].each do |klass|
Kernel.const_get(klass).prepend(Module.new do
def my_new_method
....
end
end)
end
或者,您可以预先声明此模块并调用 prepend
并在其中传递模块名称。
Mixin =
Module.new do
def my_new_method
....
end
end
["Class1", "Class2"].each do |klass|
Kernel.const_get(klass).prepend(Mixin)
end
或者,
module Mixin
def my_new_method
....
end
end
["Class1", "Class2"].each do |klass|
Kernel.const_get(klass).prepend(Mixin)
end
我想给几个 class 添加一个方法。但是我遗漏了一些我不知道如何称呼它的东西所以我无法搜索它
我想做类似的事情
["Class1", "Class2"].each do |klass|
class klass.constantize
def my_new_method
....
end
end
end
显然代码不起作用,但您明白了。如何使 klass 成为 class 名称以便我可以声明该方法?
使用const_get
and class_eval
:
class A;
def a;
puts :a;
end;
end
Kernel.const_get("A").class_eval { def b; puts :b; end }
pry(main)> A.new.b
b
=> nil
将功能添加到多个 classes 通常是使用 mixins。 Module#prepend
是你的朋友。这样,如果方法 覆盖 扩展 class.
super
["Class1", "Class2"].each do |klass|
Kernel.const_get(klass).prepend(Module.new do
def my_new_method
....
end
end)
end
或者,您可以预先声明此模块并调用 prepend
并在其中传递模块名称。
Mixin =
Module.new do
def my_new_method
....
end
end
["Class1", "Class2"].each do |klass|
Kernel.const_get(klass).prepend(Mixin)
end
或者,
module Mixin
def my_new_method
....
end
end
["Class1", "Class2"].each do |klass|
Kernel.const_get(klass).prepend(Mixin)
end