Неясно, почему вы хотите создать класс в первую очередь. Если для этого есть веские причины, мой ответ является недействительным.
Вы можете вести себя желаемым образом, используя «стандартные» методы ООП и работая с экземплярами
class Fetcher
def initialize(resource_name)
@resource_name = resource_name
end
def all
"http://some.remote.resource/#{@resource_name}/all"
end
end
xyz_fetcher = Fetcher.new('xyz')
xyz_fetcher.all
В противном случае ваш кодэто более или менее то, что вы бы / должны сделать, я думаю. Просто я бы позволил классу Fetcher
выступать в роли одиночного (не использовать экземпляр Fetcher
):
class Fetcher < ApplicationService
# make a singleton by privatizing initialize (read this up somewhere else)
def self.build(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
Тогда
Xyz = Fetcher.build('xyz')
Xyz.all
Теперь у вас есть материалс ApplicationService
, который более или менее достигает этого (и пропускает блок), так что, вероятно, мы читатели пропускаем некоторые части общей картины ... пожалуйста, уточните, если это так.
Помимо синглетонизации, вы могли бывместо этого также работайте с модулями (спасибо @max за комментарий).