Block不是对象,应通将其转为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
可以打破封装,查看并修改对象内容。
Proc Object
-
&
可以让block和proc互相切换 - lambda和proc都返回一个proc对象。lambda就是匿名函数;而proc会自动对参数进行适配,并且
return
会使得所在作用域返回。 - 推荐的lambda单行写法:->(arg0, arg1, ...) { ... }
洁净室(Clean Room)
洁净室通常是一个简单的对象,通过internal_eval
制造一个环境,在其中执行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. 这里有嵌套循环,是N^2的时间复杂度啊,不禁觉得Clean Room不适合用在这里……