Определить именованный модуль
Один из способов справиться с этим - определить собственный тип модуля, который можно инициализировать именем.
class NamedModule < Module
attr_accessor :name
def initialize(name, &block)
super(&block)
self.name = name
end
def to_s
[self.class.name, name, object_id].join(':')
end
end
Тогда вы можете сделать это:
piracy = NamedModule.new("Piracy") do
def berate
puts "Yer a #{adjectives.sample} #{nouns.sample}!"
end
private
def adjectives
%w[yella-bellied landlubbing]
end
def nouns
%w[scallywag bilge-drinker]
end
end
Sailor = Class.new
Sailor.send(:include, piracy)
Sailor.new.berate #=> "Yer a yella-bellied scallywag!"
Определение to_s
дает хороший вывод в ancestors
:
Sailor.ancestors
#=> [Sailor, NamedModule:Piracy:70169997844420, Object, Kernel, BasicObject]
Обновление - используйте Именованный камень
После того, как мы с коллегой поэкспериментировали с этим, он написал небольшую реализацию гема. Проверьте Именованный драгоценный камень - Rubygems и Github .