Ruby on Rails 入门之:(21) ruby中代码块的使用以及动态执行代码
1. 代码块的执行
Ruby支持定义一个代码块,然后调用这个代码块。
Proc即使对块及局部变量的作用域进行对象话处理后得到的过程对象。
[ruby]
#encoding:gbk
pr = Proc.new {puts "使用Proc";};
pr.call;
#encoding:gbk
pr = Proc.new {puts "使用Proc";};
pr.call;
上面的代码简单的定义了一个代码块,然后调用了这个代码块。
代码块变量也可以作为参数进行传递。
[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);
#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);
看下输出结果:
[html] view plaincopyprint?watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
watkins@watkins:~/temp/workspace/ruby$
watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
watkins@watkins:~/temp/workspace/ruby$
在Ruby中定义方法是,在方法的最后一个参数添加&符号,程序会将这个形参的内容作为一个Proc代码块来处理。看一下例子:
[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 "把传递的参数作为代码块来运行";};
#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 "把传递的参数作为代码块来运行";};
输出结果为:
[html]
watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
把传递的参数作为代码块来运行
watkins@watkins:~/temp/workspace/ruby$
watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
把传递的参数作为代码块来运行
watkins@watkins:~/temp/workspace/ruby$
2. 动态执行字符串代码
很多语言都有动态的执行用户输入的字符串代码的方法,而且大部分都是使用eval这个函数来实现,Ruby也提供了这样的函数。
[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);
#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);
输出结果:
[html]
watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
把传递的参数作为代码块来运行
hello
Fri Oct 12 15:42:33 +0800 2012
watkins@watkins:~/temp/workspace/ruby$
watkins@watkins:~/temp/workspace/ruby$ ruby proc.rb
使用Proc
在外部定义的变量
在函数内部定义的变量
在外部定义的变量
把传递的参数作为代码块来运行
hello
Fri Oct 12 15:42:33 +0800 2012
watkins@watkins:~/temp/workspace/ruby$
:-),上面的实例变量没有访问到。。。
eval动态执行代码的效率非常低,除非特别有必要,尽量的不要使用。
补充:Web开发 , 其他 ,