六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 170|回复: 0

玩转Ruby系列:玩转闭包(Block,Proc,lambda)

[复制链接]

升级  44.67%

31

主题

31

主题

31

主题

秀才

Rank: 2

积分
117
 楼主| 发表于 2013-2-7 20:59:08 | 显示全部楼层 |阅读模式
Block,lambda,Proc要好好理解下,在Ruby中很重要。

  • Block块就是一个匿名函数,被调用的方法调用,在调用的方法里面通过field调用。Block主要用于迭代。
arr = [1,2,3,4,5]arr.each{|item| puts item}

  • Proc也是一个代码块,相当于过程吧
a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}a_proc.call(9, 1, 2, 3)   #=> [9, 18, 27]   Proc.new新建一个Proc对象时,可以不带一个block,只是在定义Proc的方法上带一个block,这个block会变成属于Proc的。
def proc_from  Proc.newendproc = proc_from { "hello" }proc.call   #=> "hello" Proc对象是与局部变量绑定的一个代码块。绑定之后,代码可以在不同的上下文中调用,并可以访问局部变量。
def gen_times(factor)  return Proc.new {|n| n*factor }endtimes3 = gen_times(3)times5 = gen_times(5)times3.call(12)               #=> 36times5.call(5)                #=> 25times3.call(times5.call(4))   #=> 60 

  • lambda也是匿名函数
a_lambda = lambda {|a| puts a}a_lambda.call("samsam") lambda返回的是一个Proc对象。
a_lambda.class #=>Proc lambda和Proc是一样的,除了Proc的return会跳出调用的方法,lambda则不会,它只是返回自己。
def foo      f = Proc.new { return "return from foo from inside proc" }      f.call # control leaves foo here      return "return from foo"     end        def bar      f = lambda { return "return from lambda" }      puts f.call # control does not leave bar here  prints "return from lambda"     return "return from bar"     end        puts foo # prints "return from foo from inside proc"     puts bar # prints "return from bar"    参考:
http://www.ruby-doc.org/core/
http://www.artima.com/intv/closures.html
http://blackanger.blog.51cto.com/140924/83700
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表