Ruby元編程筆記 - Block

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_execinstance_eval可以打破封裝,查看并修改對象內(nèi)容。

Proc Object

  1. &可以讓block和proc互相切換
  2. lambda和proc都返回一個proc對象。lambda就是匿名函數(shù);而proc會自動對參數(shù)進行適配,并且return會使得所在作用域返回。
  3. 推薦的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不適合用在這里……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容