Я думаю лучший способ (и главным образом как существующий освобождает, записаны), делают это путем создания класса в модуле, который имеет дело со всей логикой, и модуль просто предоставляет удобный метод, например,
module GTranslate
class Translator
def perform( text ); 'hola munda'; end
end
def self.translate( text )
t = Translator.new
t.perform( text )
end
end
Существует также Module.private_class_method
, который возможно выражает более полный решимости.
module Foo
def self.included(base)
base.instance_eval do
def method_name
# ...
end
private_class_method :method_name
end
end
end
Для кода в вопросе:
module Thing
def self.pub; puts "Public method"; end
def self.priv; puts "Private method"; end
private_class_method :priv
end
Ruby 2.1 или более новый:
module Thing
def self.pub; puts "Public method"; end
private_class_method def self.priv; puts "Private method"; end
end
Можно использовать "включенный" метод, чтобы сделать необычные вещи, когда модуль смешан в. Это делает, о каком Вы хотите, я думаю:
module Foo
def self.included(base)
class << base
def public_method
puts "public method"
end
def call_private
private_method
end
private
def private_method
puts "private"
end
end
end
end
class Bar
include Foo
end
Bar.public_method
begin
Bar.private_method
rescue
puts "couldn't call private method"
end
Bar.call_private
К сожалению, private
только относится к методам экземпляра. Общий способ получить частные "статические" методы в классе состоит в том, чтобы сделать что-то как:
class << self
private
def foo()
....
end
end
По общему признанию я не играл с выполнением этого в модулях.