Как насчет хранения методов в виде лямбд в переменных / константах класса?
module MyModule
@@my_secret_method = lambda {
# ...
}
# ...
end
Для теста:
UPD: огромное обновление этого кода через 6 лет показывает более чистый способ объявления частного метода d
module A
@@L = lambda{ "@@L" }
def self.a ; @@L[] ; end
def self.b ; a ; end
class << self
def c ; @@L[] ; end
private
def d ; @@L[] ; end
end
def self.e ; c ; end
def self.f ; self.c ; end
def self.g ; d ; end
def self.h ; self.d ; end
private
def self.i ; @@L[] ; end
class << self
def j ; @@L[] ; end
end
public
def self.k ; i ; end
def self.l ; self.i ; end
def self.m ; j ; end
def self.n ; self.j ; end
end
for expr in %w{ A.a A.b A.c A.d A.e A.f A.g A.h A.i A.j A.k A.l A.m A.n }
puts "#{expr} => #{begin ; eval expr ; rescue => e ; e ; end}"
end
Здесь мы видим, что:
A.a => @@L
A.b => @@L
A.c => @@L
A.d => private method `d' called for A:Module
A.e => @@L
A.f => @@L
A.g => @@L
A.h => private method `d' called for A:Module
A.i => @@L
A.j => @@L
A.k => @@L
A.l => @@L
A.m => @@L
A.n => @@L
1) @@L
нельзя получить доступ извне, но доступен почти везде
2) class << self ; private ; def
успешно делает метод d
недоступным снаружи и изнутри с помощью self.
, но не без него - это странно
3) private ; self.
и private ; class << self
не делают методы приватными - они доступны как с self.
, так и без него