• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Block,lambda,Proc要好好理解下,在Ruby中很重要。

  • Block块就是一个匿名函数,被调用的方法调用,在调用的方法里面通过field调用。Block主要用于迭代。
Ruby代码 :

 

arr = [1,2,3,4,5]
arr.each{|item| puts item}

Proc也是一个代码块,相当于过程吧
Ruby代码 :
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的。

Ruby代码 :

def proc_from
  Proc.new
end

 

proc = proc_from { "hello" }
proc.call   #=> "hello"

Proc对象是与局部变量绑定的一个代码块。绑定之后,代码可以在不同的上下文中调用,并可以访问局部变量。

 

Ruby代码
def gen_times(factor)
  return Proc.new {|n| n*factor }
end

 

times3 = gen_times(3)
times5 = gen_times(5)

times3.call(12)               #=> 36
times5.call(5)                #=> 25
times3.call(times5.call(4))   #=> 60

lambda也是匿名函数

 

Ruby代码
a_lambda = lambda {|a| puts a}
a_lambda.call("samsam")

 

 lambda返回的是一个Proc对象。

Ruby代码

a_lambda.class #=>Proc

 lambda和Proc是一样的,除了Proc的return会跳出调用的方法,lambda则不会,它只是返回自己。

Ruby代码

 

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"  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Ruby-Clamp发布时间:2022-07-14
下一篇:
Linux超快速安装Ruby on Rails发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap