Ruby中的绑定和eval
来源:互联网 发布:网络安全法公安机关 编辑:程序博客网 时间:2024/06/06 16:29
ruby是一种脚本语言,他的每一步执行都需要一个上下文环境,我们知道ruby的顶层环境就是main作为self,ruby的eval可以把传入的字符串当作脚本代码来解释执行,这里同样需要一个作用域。我们来看一个实验:
irb
name = “tony”
eval(“p name”)
=> tony
def test
name = “hello”
end
test
=> hello
name
=> tony
这里说明方法里和方法外各自的作用域不同,并且方法内的局部变量不会覆盖外面的变量
我们再来看
def test_x
name = “ruby”
return binding
end
b = test_x
=><Binding:xxxxxxx>
eval(“name”,b)
=>ruby
好了,这里我们看到eval输出的是ruby而不是tony,那么说明eval的执行上下文环境是可以通过第二个参数传进去的,而此时,我们对方法进行了绑定,因此在这个作用域里,name就是ruby,那么我们接下来再去看看Binging到底绑定的是什么
irb打开一个新的会话窗口
class MyClass
def test_bind
name = ‘tony’
@name = ‘Tony’
b = binding
age = 23
@age = 24
return b
end
end
m = MyClass.new
b = m.test_bind
eval(‘m.name’)
=>undefined method ‘name’ for <MyClass:0xxxxxxx…>
说明在退出m的test_bind作用域后,我们无法访问其中的局部变量
eval(‘m.@name’)
=> syntax error,因为我们不能直接访问m.@name
eval(‘name’,b)
=>tony
说明,这个绑定包含定义绑定前的局部变量
eval(‘age’,b)
=>23
说明,这个绑定包含定义在绑定后的局部变量
eval(‘@name’,b)
=>Tony
说明,同样能绑定实例变量
eval(‘self’,b)
=><MyClass:0xxxxxxxx…>
说明绑定保存了当时的self对象
eval(‘self.name’,b)
undefined method ‘name’ of <MyClass:0xxxxxxxxxxxx>
综上:Binding用在方法中时,不论定义在哪里,它都能够保存当前作用域(方法)和当前的self对象,以供eval方法调用,同样地,在类方法也有同样的作用
接下来,我们再来看下Binding对proc等的保存
irb开启一个新的会话窗口
def test_bind(x,y,&p)
p “x:#{x},y:#{y}”
p p.call x,y
return binding
end
p1 = Proc.new(){|x,y| x+y}
p2 = Proc.new(){|x,y| x*y}
b1 = test_bind(3,5,&p1)
=>x:3,y:5
=>8
=><Binding:0xxxxxxxxx…>
b2 = test_bind(3,5,&p2)
=>x:3,y:5
=>15
=><Binding:-xxxxxxxxx>
eval(‘p.call x,y’,b1)
=>8
eval(‘p.call x,y’,b2)
=>15
充分说明,Binding不仅可以保存作用域的变量和self,还能保存作用域中的block对象
只有充分理解了ruby中的Binding,才能理解很多后面的东西,也才能更好地发挥eval的作用,就先记到这里!
0 0
- Ruby中的绑定和eval
- Ruby中的eval与binding
- .NET 中的DataBinder.Eval和数据绑定技术
- Asp.net中的数据绑定Eval和Bind
- c#中的数据绑定 Eval和Bind的区别
- ASP.NET中的Eval和DataBinder.Eval方法 bind是双向绑定
- ASP.NET中数据绑定的Eval 和 bind 的区别及数据绑定中的操作
- 深入理解 ruby 中的 eval 与 binding
- ruby eval
- php中的eval和JavaScript中的eval
- 剖析数据绑定中的DataBinder.Eval
- 数据绑定表达式语法Eval和Bind
- Eval和DataBind方法绑定页面数据
- Eval和DataBind方法绑定页面数据
- 绑定表达式 Eval()和Bind()的区别
- Eval数据绑定语法绑定Image、Label和HyperLink控件
- Python 中的 exec 和 eval
- shell脚本中的eval、‘‘和$()
- 第四、五周作业
- 网络121第5周实验——GUI编程及JDK API的使用
- java多线程回顾(一)
- Legal or Not
- Web编程学习七:使用JPA + RESTful Web Service + SAPUI5来创建Web应用
- Ruby中的绑定和eval
- 第三周作业2
- 黑马程序员—网络编程入门基础
- From《Expert C Programming》01
- 15 Linux更改权限解决新建用户不能读写创建文件/文件夹的问题
- Web编程学习八:通过Apache Cordova将Web应用移动化
- 选择排序 自己终于会写了
- java笔记之内部类
- PKU 1573