【发布时间】:2020-02-22 11:15:33
【问题描述】:
可能还有很多其他更好的方法;但有以下代码:
class ApplicationService
def self.build(*args, &block)
new(*args, &block).build
end
end
class BaseClass; end
class Fetcher < ApplicationService
attr_reader :resource_name
def initialize(resource_name)
@resource_name = resource_name
end
def build
resource_name = @resource_name
Class.new(BaseClass) do
@@resource_name = resource_name
class << self
def all
"http://some.remote.resource/#{@@resource_name}/all"
end
end
end
end
end
为了在self.all 方法中有初始的resource_name,我想出了定义@@resource_name = resource_name。我完全不确定这是否是好方法。
我希望能够使用这样的“生成器”,以便提供以下接口:
## In some kind of initializers :
Xyz = Fetcher.build('xyz')
## Final use :
Xyz.all
是否有更好的模式来动态创建类,同时在创建此类时传递参数?
【问题讨论】:
-
您是否有理由不想让
build返回BaseClass的实例?您可以将all移动到BaseClass并将 resource_name 作为常规实例变量存储在那里 -
@maxpleaner 确实更干净。你如何将
resource_name传递给 BaseClass ? -
BaseClass.new(resource_name)或类似的东西