美文网首页
Ruby元编程笔记 - Block

Ruby元编程笔记 - Block

作者: Kumiko | 来源:发表于2015-07-18 13:24 被阅读73次

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

    Block不是对象,应通将其转为proc进行传递。 作用域门 Scope Gate 作用域门一共有三个:modul...

  • Ruby元编程笔记 - 方法

    Dynamic Method 通过send()去动态调用方法: 在Ruby2.2.2中,send()依然可以调用私...

  • Ruby元编程

    类 方法 代码块 类宏 Eval方法 实例变量、方法、类 实例变量(Instance Variables)是当你使...

  • ruby元编程

    对象模型 所有class定义之外的代码默认运行在顶级对象main中。 打开类 ruby的class更像是一个作用于...

  • Ruby元编程笔记 - 对象模型

    Tips 类名不过是常量 对象包含了实例变量,它就好像一个Hash表一样。 方法存放在类之中。 类自身也是对象 所...

  • Ruby元编程笔记 - 类中的魔法

    Ruby元编程笔记 - 类定义 类定义揭秘 在类定义中,self就是正在定义的类。 所有使用def定义的方法都成了...

  • ruby元编程(1)

    面试中碰到一些面试官提到的关于ruby元编程的问题的总结 class和module的区别 官方说明class do...

  • Ruby元编程示例

  • ruby元编程(附录)

    拟态方法 拟态方法就是去掉括号调用方法的方式,会给ruby开发者带来很多语法糖,当然也会给开发者和ruby本身增加...

  • 2016-11-04 task-list

    今日任务 ruby on rails 第四章 ruby 元编程 今日总结 ruby 单引号与双引号字符串的重大区别...

网友评论

      本文标题:Ruby元编程笔记 - Block

      本文链接:https://www.haomeiwen.com/subject/prqpqttx.html