Ruby 扁平化作用域的简单解释

zhangzitao · 2017年11月03日 · 最后由 pynix 回复于 2017年11月04日 · 1537 次阅读

刚写的一个小测试,记录下来

我们知道module class def这样的关键字会封闭变量的作用域

当需要在另一个类里直接调用外部变量时,可以使用扁平化作用域的编写方式:

module Try
  MyClass1 = Class.new do |ef|
    def ffff
      p "ffff"
    end
  end

  my = MyClass1.new

  MyClass2 = Class.new do |ef|
    define_method(:gggg) do |args = nil|
      p defined? my
      my.ffff
      p args
    end
  end

  MyClass2.new.gggg
  #=> "local-variable"
  #=> "ffff"
  #=> nil
  MyClass2.new.send :gggg, 123
  #=> "local-variable"
  #=> "ffff"
  #=> 123

  class MyClass3
    define_method(:gggg) do |args = nil|
      p defined? my
    end
  end

  MyClass3.new.gggg
  #=> nil
end

使用关键字定义时,my 是未定义的变量

使用块扁平化作用域时,my 是同一个作用域内的局部变量

1 楼 已删除

这就叫闭包作用域,不是必要最好不要生造名词……

mizuhashi 回复

并没有啊,《Ruby 元编程》里面就把这叫做扁平作用域(flat scope)。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号