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