当前位置:编程学习 > 网站相关 >>

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开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,