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