在Ruby中,如何在运行时向现有对象实例添加方法?

在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的

用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的特征类:

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只想将其添加到特定实例中。