Я знаю, что это действительно старый вопрос, и некоторые другие Rubyists могли бы избегать меня от сообщества из-за этого, но я работаю над созданием очень тонкой оболочки-обертки, которая оборачивает популярный проект Java с классами ruby. Основываясь на ответе @ sepp2k, я создал несколько вспомогательных методов, потому что мне приходилось делать это много, много раз в одном проекте. Обратите внимание, что я назвал пространство этих методов так, чтобы они не загрязняли пространство имен верхнего уровня, например Object или Kernel.
module Redbeam
# helper method to create thin class wrappers easily within the given namespace
#
# @param parent_klass [Class] parent class of the klasses
# @param klasses [Array[String, Class]] 2D array of [class, superclass]
# where each class is a String name of the class to create and superclass
# is the class the new class will inherit from
def self.create_klasses(parent_klass, klasses)
parent_klass.instance_eval do
klasses.each do |klass, superklass|
parent_klass.const_set klass, Class.new(superklass)
end
end
end
# helper method to create thin module wrappers easily within the given namespace
#
# @param parent_klass [Class] parent class of the modules
# @param modules [Array[String, Module]] 2D array of [module, supermodule]
# where each module is a String name of the module to create and supermodule
# is the module the new module will extend
def self.create_modules(parent_klass, modules)
parent_klass.instance_eval do
modules.each do |new_module, supermodule|
parent_klass.const_set new_module, Module.new { extend supermodule }
end
end
end
end
Чтобы использовать эти методы (обратите внимание, что это JRuby):
module Redbeam::Options
Redbeam.create_klasses(self, [
['PipelineOptionsFactory', org.apache.beam.sdk.options.PipelineOptionsFactory]
])
Redbeam.create_modules(self, [
['PipelineOptions', org.apache.beam.sdk.options.PipelineOptions]
])
end
ПОЧЕМУ ??
Это позволяет мне создать гем JRuby, который использует проект Java, и позволит сообществу открытого исходного кода и мне в будущем при необходимости украшать эти классы. Это также создает более дружественное пространство имен для использования классов. Так как мой гем - очень, очень тонкая оболочка, мне пришлось создать много-много подклассов и модулей для расширения других модулей.
Как мы говорим в J.D. Power, «это разработка, основанная на извинениях: извините».