Ruby on Rails 入门之:(21) ruby中代码块的使用以及动态执行代码

1. 代码块的执行


Ruby支持定义一个代码块,然后调用这个代码块。

Proc即使对块及局部变量的作用域进行对象话处理后得到的过程对象。


#encoding:gbk

pr = Proc.new {puts "使用Proc";};
pr.call;

上面的代码简单的定义了一个代码块,然后调用了这个代码块。


代码块变量也可以作为参数进行传递。


#encoding:gbk

pr = Proc.new {puts "使用Proc";};
pr.call;

def call_proc(pr)
	local = "在函数内部定义的变量";
	puts local;
	pr.call
end

outside = "在外部定义的变量";
pr = Proc.new {puts outside;};
pr.call;
call_proc(pr);

看下输出结果:


watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb 
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
watkins@watkins:~/temp/workspace/ruby$ 

在Ruby中定义方法是,在方法的最后一个参数添加&符号,程序会将这个形参的内容作为一个Proc代码块来处理。看一下例子:


#encoding:gbk

pr = Proc.new {puts "使用Proc";};
pr.call;

def call_proc(pr)
	local = "在函数内部定义的变量";
	puts local;
	pr.call
end

outside = "在外部定义的变量";
pr = Proc.new {puts outside;};
pr.call;
call_proc(pr);

def catch_proc(&blc)
	blc.call;
end

catch_proc {puts "把传递的参数作为代码块来运行";};

输出结果为:


watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb 
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
把传递的参数作为代码块来运行
watkins@watkins:~/temp/workspace/ruby$ 

2. 动态执行字符串代码


很多语言都有动态的执行用户输入的字符串代码的方法,而且大部分都是使用eval这个函数来实现,Ruby也提供了这样的函数。

#encoding:gbk

pr = Proc.new {puts "使用Proc";};
pr.call;

def call_proc(pr)
	local = "在函数内部定义的变量";
	puts local;
	pr.call
end

outside = "在外部定义的变量";
pr = Proc.new {puts outside;};
pr.call;
call_proc(pr);

def catch_proc(&blc)
	blc.call;
end

catch_proc {puts "把传递的参数作为代码块来运行";};

str = "@name='watkins';
		puts 'hello #{@name}';
		puts Time.new;
";

eval(str);


输出结果:

watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb 
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
把传递的参数作为代码块来运行
hello 
Fri Oct 12 15:42:33 +0800 2012
watkins@watkins:~/temp/workspace/ruby$ 

:-),上面的实例变量没有访问到。。。

eval动态执行代码的效率非常低,除非特别有必要,尽量的不要使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值