将方法存储为类变量/常量中的 lambda 是什么意思?
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.