クラス変数/定数内にラムダとしてメソッドを保存するのはどうですか?
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.