在Ruby中,如何在运行时向现有对象实例添加方法?
用Javascript我可以做到这一点在Ruby中,如何在运行时向现有对象实例添加方法?,ruby,metaprogramming,Ruby,Metaprogramming,用Javascript我可以做到这一点 var a = {}; a.f1 = function(){}; 我怎么用Ruby做这个 更新 在JS代码中,a是一个没有类的实例化对象。而function(){}是一个匿名函数,a.f1=将函数添加到对象实例中。因此,函数仅绑定到实例,与类或类似定义无关。Ruby和JS的对象模型非常不同,但直接翻译可能如下所示: a = Object.new def a.f1(x) 2*x end a.f1(5) #=> 10 您还可以使用Ruby的
var a = {};
a.f1 = function(){};
我怎么用Ruby做这个
更新
在JS代码中,
a
是一个没有类的实例化对象。而function(){}
是一个匿名函数,a.f1=
将函数添加到对象实例中。因此,函数仅绑定到实例,与类或类似定义无关。Ruby和JS的对象模型非常不同,但直接翻译可能如下所示:
a = Object.new
def a.f1(x)
2*x
end
a.f1(5) #=> 10
您还可以使用Ruby的特征类:
class Object
def metaclass
class << self; self; end
end
end
a = Object.new
# Also: (class << a; self; end).send(:define_method, :f1) do |x|
a.metaclass.send(:define_method, :f1) { |x| 2*x }
类对象
def元类
类JavaScript和其他语言之间存在差异,因为JavaScript以另一种方式进行继承。这不可能是直接的类比
让我们假设{}是ruby中的A类,并从中创建对象
class A
end
a = A.new
和某些模块B中的f1功能座椅
module B
def f1
puts "you've extended your object"
end
end
现在你可以用类似的方式做你想做的事
a.extend(B)
a.f1 #=> "you've extended your object"
第二个是否将块代码作为实例方法添加到对象
类中f1
?您不需要元类的东西。只需使用foo.class.send(:define_method,:bar)就可以了。。。end
@Edmund,但这会将method:bar添加到类的所有实例中,我知道OP只想将其添加到特定实例中。