[size=large]存放代码片断[/size]
Proc可以将要执行的一些代码片断放在一起,却不立即执行,而是在后来我们想要执行它的时候来调用。
[size=large]用Proc来组织我们的代码[/size]
Proc是组织代码的好工具,比如现在我们要测试一下某些代码的执行花费时间,通过Proc可以很灵活地做到这一点:
[size=large]Blocks![/size]
用Block来实现上面说的更方便,而且看起来漂亮一些:
那个yield就和a_proc.call类似,是作用block的一个点位符。
[size=large]向Proc和Block中传递参数[/size]
向Proc和Block中传递参数的方式是一样的:
看一下这个例子
我们自己再来实现Array中的each方法
另外对于block,有两种形式
{}和do end 前者优先级高。
Proc可以将要执行的一些代码片断放在一起,却不立即执行,而是在后来我们想要执行它的时候来调用。
say_hello = Proc.new { puts "Hello!" } # 代码不会立即执行
say_hello.call # 现在我们来调用运行Proc的存放的代码
# => "Hello!"
[size=large]用Proc来组织我们的代码[/size]
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 })
[size=large]Blocks![/size]
用Block来实现上面说的更方便,而且看起来漂亮一些:
def time
start = Time.now
yield
puts Time.now - start
end
time { code_here }
time { more_code_here }
那个yield就和a_proc.call类似,是作用block的一个点位符。
[size=large]向Proc和Block中传递参数[/size]
向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 前者优先级高。