ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

rails binding的应用

2022-01-20 14:34:00  阅读:276  来源: 互联网

标签:end str binding rails Fred eval mystr 应用


eval方法有一个可选的参数--binding,如果为指定的话,那么表达式的值就会是一个具体的范围或上下文环境绑定。不过不必为这个有所意外,在 Ruby中,binding方法会返回一个Binding对象的实例,可以使用binding方法返回绑定的值。下是是ruby文档中提供的一个示例:

def getBinding(str)   
   return binding()   
end   
str = "hello"   
puts( eval( "str + ' Fred'" )   )                                     #=> "hello Fred"   
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根据类而不同:

class MyClass  
   @@x = " x"  
   def initialize(s)  
      @mystr = s  
   end  
   def getBinding  
      return binding()  
   end  
end  
  
class MyOtherClass  
   @@x = " y"  
   def initialize(s)  
      @mystr = s  
   end  
   def getBinding  
      return binding()   
   end  
end  
  
@mystr = self.inspect  
@@x = " some other value"  
  
ob1 = MyClass.new("ob1 string")  
ob2 = MyClass.new("ob2 string")  
ob3 = MyOtherClass.new("ob3 string")  
puts(eval("@mystr << @@x", ob1.getBinding))  #=> ob1 string x  
puts(eval("@mystr << @@x", ob2.getBinding))  #=> ob2 string x  
puts(eval("@mystr << @@x", ob3.getBinding))  #=> ob3 string y  
puts(eval("@mystr << @@x", binding))             #=> main some other value  

 

查看api

eval(p1, p2 = v2, p3 = v3, p4 = v4) public

Evaluates the Ruby expression(s) in string. If binding is given, which must be a Binding object, the evaluation is performed in its context. If the optional filename and lineno parameters are present, they will be used when reporting syntax errors.

def get_binding(str)
  return binding
end
str = "hello"
eval "str + ' Fred'"                      #=> "hello Fred"
eval "str + ' Fred'", get_binding("bye")  #=> "bye Fred"

 

 

标签:end,str,binding,rails,Fred,eval,mystr,应用
来源: https://www.cnblogs.com/hello-ruby/p/15826231.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有