Ruby中的Proc,Block的应用说明

本文介绍了Ruby中的Proc和Block的使用方法,包括如何利用它们组织代码、测量代码执行时间以及如何向Proc和Block传递参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=large]存放代码片断[/size]
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 前者优先级高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值