将启动的实例扩展到类 Ruby


class Myobject
  def initialize(numberofcows,numberofdogs)
    @numberofcows = numberofcows
    @numberofdogs = numberofdogs
  end
  def cows
    @numberofcows
  end
  def dogs
     @numberofdogs
  end
end

定义常量:

Boo = Myobject.new(5,10)

扩展类:

class Foo
   extend Boo
end

如何将所有方法从一个启动的对象扩展到另一个类?

Foo.cows => 5
Foo.dog  => 10

Myobject 是一个从 YAML 文件读取并从中创建方法的类。 它们是应用程序设置。 我需要将这些动态分配的方法添加到另一个类中。

不能扩展对象*。如果没有您的实际用例,就很难提供明确的答案,因此这里有一些替代方案。

* 除非该对象是一个模块,但我们不要在这里进行技术讨论。

使用Forwardable

Forwardable模块可以帮助您定义委托人。但是,它不能很好地处理动态对象。

class Foo
  class << self
    extend Forwardable
    def_delegators :my_object, :cows, :dogs
    def my_object
      @my_object ||= MyObject.new(5, 10)
    end
  end
end
Foo.cows # => 5
Foo.dog  # => 10

使用"动态"委托人

如果您的MyObject类具有动态方法,则可以创建一个动态委托器,该委托器将调用MyObject实例的任何公共方法。

class Foo
  class << self
    def setting(method)
      my_object.public_send(method)
    end
    private
    def my_object
      @my_object ||= MyObject.new(5, 10)
    end
  end
end
Foo.setting('cows') # => 5
Foo.setting('dogs') # => 10

完全避免元编程

我认为这是元编程的糟糕用法。如果你想导航一个 YAML/JSON 结构,你应该在没有元程序的情况下进行。

例如,给定一个像这样的 YAML:

---
cows: 5
dogs: 10

你可以写以下内容。

class Foo
  class << self
    def setting(key)
      settings[key]
    end
    private
    def settings
      @settings ||= YAML.load_file('settings.yaml')
    end
  end
end
Foo.setting('cows') # => 5
Foo.setting('dogs') # => 10

最新更新