首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ruby中的运行时将方法添加到现有的对象实例中?

如何在Ruby中的运行时将方法添加到现有的对象实例中?
EN

Stack Overflow用户
提问于 2011-11-12 13:41:53
回答 2查看 7.5K关注 0票数 5

在Javascript里我可以这么做。

代码语言:javascript
复制
var a = {};
a.f1 = function(){};

我怎么能在Ruby里做到这一点?

更新。

在JS代码中,a是一个没有类实例化的对象。function(){}是一个匿名函数,a.f1 =将该函数添加到对象实例中。因此,函数仅绑定到实例,与类或类似定义无关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-12 14:08:49

Ruby和JS的对象模型非常不同,但直接翻译可能如下所示:

代码语言:javascript
复制
a = Object.new
def a.f1(x) 
  2*x
end

a.f1(5) #=> 10

还可以使用Ruby的本征类:

代码语言:javascript
复制
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 }

警告注意:您将在元编程/猴子识别/.但在编写“普通”代码时,这并不常见,因为其他技术(主要是模块混合)适用。

票数 17
EN

Stack Overflow用户

发布于 2011-11-12 14:09:33

JavaScript和其他语言有区别,因为JavaScript以另一种方式进行继承。所以这里不可能有直接的模拟。

让我们假设{}是ruby中的A类,然后用它创建对象

代码语言:javascript
复制
class A
end

a = A.new

和f1函数在某些模块B中的位置

代码语言:javascript
复制
module B
  def f1
    puts "you've extended your object"
  end
end

现在你可以用类似的方式做你想做的事了

代码语言:javascript
复制
a.extend(B)

a.f1 #=> "you've extended your object"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8104779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档