Ruby元编程笔记 - Block

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_execinstance_eval可以打破封装,查看并修改对象内容。

Proc Object

  1. &可以让block和proc互相切换
  2. lambda和proc都返回一个proc对象。lambda就是匿名函数;而proc会自动对参数进行适配,并且return会使得所在作用域返回。
  3. 推荐的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不适合用在这里……

你可能感兴趣的:(Ruby元编程笔记 - Block)