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

zhangzitao · November 03, 2017 · Last by pynix replied at November 04, 2017 · 1525 hits

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

我们知道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 Floor has deleted

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

Reply to mizuhashi

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

You need to Sign in before reply, if you don't have an account, please Sign up first.