诗歌rails之 binding

eval方法有一个可选的参数--binding,如果为指定的话,那么表达式的值就会是一个具体的范围或上下文环境绑定。不过不必为这个有所意外,在 Ruby中,binding方法会返回一个Binding对象的实例,可以使用binding方法返回绑定的值。下是是ruby文档中提供的一个示例:
Ruby代码
  1. def getBinding(str)   
  2.    return binding()   
  3. end   
  4. str = "hello"   
  5. puts( eval( "str + ' Fred'" )   )                                     #=> "hello Fred"   
  6. puts( eval( "str + ' Fred'", getBinding("bye") ) )              #=> "bye Fred"  
binding方法是内核的一个私有方法。getBinding方法通过调用binding方法返回当前上下文环境中str的值。在第一次调用 eval方 法的时候,当前上下文环境是main对象,并且str的值就是定义的局部变量str的值。在第二次调用eval方法是,当前的上下文环境则是 getBinding方法内部,局部变量str的值现在则为getBinding方法中参数str的值。Binding方法经常作为eval的第二个参 数,这样eval就不会因为找不到变量而出错了。

上下文环境也可以在类中定义。在下面的例子中,可以看到,实例变量@mystr和类变量@@x根据类而不同:
Ruby代码
  1. class MyClass  
  2.    @@x = " x"  
  3.    def initialize(s)  
  4.       @mystr = s  
  5.    end  
  6.    def getBinding  
  7.       return binding()  
  8.    end  
  9. end  
  10.   
  11. class MyOtherClass  
  12.    @@x = " y"  
  13.    def initialize(s)  
  14.       @mystr = s  
  15.    end  
  16.    def getBinding  
  17.       return binding()   
  18.    end  
  19. end  
  20.   
  21. @mystr = self.inspect  
  22. @@x = " some other value"  
  23.   
  24. ob1 = MyClass.new("ob1 string")  
  25. ob2 = MyClass.new("ob2 string")  
  26. ob3 = MyOtherClass.new("ob3 string")  
  27. puts(eval("@mystr << @@x", ob1.getBinding))  #=> ob1 string x  
  28. puts(eval("@mystr << @@x", ob2.getBinding))  #=> ob2 string x  
  29. puts(eval("@mystr << @@x", ob3.getBinding))  #=> ob3 string y  
  30. puts(eval("@mystr << @@x", binding))             #=> main some other value  
posted @ 2009-07-14 17:14  麦飞  阅读(271)  评论(0编辑  收藏  举报