使用闭包突破作用域的约束

2016-06-23  本文已影响36人  33d8e4ec2cc9

ruby里作用域之间宛如身处两个异世界,当你试图穿过一个作用域的时候,变量会立即失效,而不是像在js里面你定义一个全局变量之后,任何function里面都能调用

aa = 'success!' 
class MyClass
  def my_method
    puts aa
  end
end

MyClass.new.my_method
=> NameError: undefined local variable or method `aa' for #<MyClass:0x007fb67a84ab88>

你期望能在这个方法里面能够输出success!,然而却并不能,aa这个变量和MyClass这个class还有my_method这个方法身处三个作用域,他们之间无法互相取变量,那怎么样才能让他们共享一个作用域呢。

aa = 'success!'
MyClass = Class.new do
  define_method :my_method do 
    puts aa
  end
end

MyClass.new.my_method
=> 'success!'

用Class.new代替class,用define_method代替def,此时他们便处于一个作用域中了!

为什么会想到写这个,主要是在写招采外网动态标题方法的时候碰到的一个问题。

上一篇下一篇

猜你喜欢

热点阅读