Block不是對象,應通將其轉(zhuǎn)為proc進行傳遞。
作用域門 Scope Gate
作用域門一共有三個:module, class, def
my_var = "value"
MyClass = Class.new do
puts my_var
define_method :my_method do
puts my_var
end
end
上下文探針(Context Probe)
instance_exec和instance_eval可以打破封裝,查看并修改對象內(nèi)容。
Proc Object
-
&可以讓block和proc互相切換 - lambda和proc都返回一個proc對象。lambda就是匿名函數(shù);而proc會自動對參數(shù)進行適配,并且
return會使得所在作用域返回。 - 推薦的lambda單行寫法:->(arg0, arg1, ...) { ... }
潔凈室(Clean Room)
潔凈室通常是一個簡單的對象,通過internal_eval制造一個環(huán)境,在其中執(zhí)行block,使block可對實例變量進行讀寫。
簡易DSL
module D
@setups = []
@events = {}
module_function
def event(name, &block)
@events[name] = block
end
def setup(&block)
@setups << block
end
def each_event(&block)
@events.each_pair do |name, event|
block.call name, event
end
end
def each_setup(&block)
@setups.each do |setup|
block.call setup
end
end
Dir["*event.rb"].each do |file|
load file
each_event do |name, event|
env = Object.new # The clean room
each_setup do |setup|
env.instance_eval &setup
end
puts "ALERT: #{name}" if env.instance_eval &event
end
end
end
P.S. 這里有嵌套循環(huán),是N^2的時間復雜度啊,不禁覺得Clean Room不適合用在這里……