【问题标题】:Ruby How to inherit from object given in constructorRuby如何从构造函数中给出的对象继承
【发布时间】:2014-02-12 19:23:24
【问题描述】:

我是动态类型编程语言的新手,我遇到了继承问题。 就我而言,我学习了 Ruby 课程:

class Vertex
  def initialize(given_object, *edges)
    @o = given_object
    @e = edges
  end
end

我需要为对象类扩展 Vertex 类,

class Vertex < given_object

所以我需要从构造函数中给出的对象扩展我的对象

我知道这是基本知识,但正如我之前提到的,我是动态类型语言的新手。

@已编辑: 好的,我明白了,让我们考虑这个例子:

class TestClass
  def initialize(object)
    @object = object
    TestClass < object.class
  end
end

#now In code I want to run each method on TestClass because it should inherit from Array
v = TestClass.new([1,2,3,4,5,6,7,8,9])    
v.each { |number| print number}

但我得到了解释器错误

 `<top (required)>': undefined method `each' for #<TestClass:0x00000001275960 @object=[1, 2, 3, 4, 5, 6, 7, 8, 9]> (NoMethodError)

【问题讨论】:

  • 不是def Vertex,而是class Vertex
  • Mazeryt,重新编辑。您尚未为 TestClass 定义方法 each 并且未为其任何祖先定义 eachTestClass.ancestors =&gt; [TestClass, Object, PP::ObjectMixin, Kernel, BasicObject]。因此,未定义的错误异常。您使用 class 关键字定义 TestClassTestClass &lt; object.class 在这里是TestClass &lt; Array,它告诉你TestClass 是否是Array 的子类;它不会改变TestClass 的出身。在这里它返回nil。见Module#<

标签: ruby dynamic-typing


【解决方案1】:

当所有方法都代理到给定模型时,您可能希望使用装饰器模式:

class TestClass
  def initialize(object)
    @object = object
  end

  def method_missing(method, *args, &block)
    @object.send(method, *args, &block)
  end
end

v = TestClass.new([1,2,3,4,5,6,7,8,9])    
v.each { |number| print number}

【讨论】:

  • 这正是我所需要的 :) 谢谢!
【解决方案2】:

很遗憾,您不能在运行时更改对象的超类。

请参阅How to dynamically alter inheritance in Ruby 了解可能对您有用的一些替代想法。

【讨论】:

    【解决方案3】:

    def 关键字用于方法,而不是类。尝试使用class vertex 看看您的问题是否得到解决。

    【讨论】:

    • 谢谢我编辑了我的问题,你可以看看编辑吗?
    • def 关键字用于方法,而不是函数。
    • @JörgWMittag 哎呀,你是对的。最近做了太多函数式编程:)
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多