Ruby中的Proc,Block的应用说明
存放代码片断Proc可以将要执行的一些代码片断放在一起,却不立即执行,而是在后来我们想要执行它的时候来调用。
say_hello = Proc.new { puts "Hello!" } # 代码不会立即执行say_hello.call # 现在我们来调用运行Proc的存放的代码# => "Hello!"
用Proc来组织我们的代码
Proc是组织代码的好工具,比如现在我们要测试一下某些代码的执行花费时间,通过Proc可以很灵活地做到这一点:
def time(a_proc)start = Time.nowa_proc.callputs Time.now - startendtime(Proc.new { code_here })time(Proc.new { more_code_here })
Blocks!
用Block来实现上面说的更方便,而且看起来漂亮一些:
def timestart = Time.nowyieldputs Time.now - startendtime { code_here }time { more_code_here }
那个yield就和a_proc.call类似,是作用block的一个点位符。
向Proc和Block中传递参数
向Proc和Block中传递参数的方式是一样的:
def dumb_hello_world_testyield(5)enddumb_hello_world_test {|i| puts i * 2 }# => 10my_silly_proc = Proc.new {|name| puts name.upcase }my_silly_proc.call("August Lilleaas")# => "AUGUST LILLEAAS"
看一下这个例子
.map {|i| puts i * 2 }# => 2# => 4# => 6
我们自己再来实现Array中的each方法
class Arraydef each i = 0 while(i < self.length) do yield(self) i += 1 endendendmy_array = ["a", "b", "c"]my_array.each {|letter| puts letter }# => "a"# => "b"# => "c"
另外对于block,有两种形式
{}和do end 前者优先级高。
页:
[1]