Ruby系列:玩转闭包(Block,Proc,lambda)
2010-05-17 13:26
656 查看
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"
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"
相关文章推荐
- 玩转Ruby系列:玩转闭包(Block,Proc,lambda)
- Ruby中使用Block、Proc、lambda实现闭包
- What Is the Difference Between a Block, a Proc, and a Lambda in Ruby
- ruby中Block, Proc 和 Lambda 浅析
- Ruby中的block、proc、lambda区别总结
- ruby 中的Block,lambda,Proc
- Ruby学习笔记-Block, Proc and Lambda
- ruby 的代码块 proc/lambda/method/block
- Ruby 中的 block、proc、lambda
- Ruby 之 Block, Proc, Lambda 联系--区别,转载
- ruby中proc和lambda的return区别
- ruby中的&操作符,以及各种闭包、proc的调用研究
- Alex学Ruby[详解 block和Proc对象]
- 匿名函数、闭包、lambda表达式、Block
- ruby的Proc和代码块(Block)
- 浅谈Ruby中的block, proc, lambda, method object的区别
- Alex学Ruby[详解 block和Proc对象 2]
- Ruby Proc 和 lambda的共同点和区别
- 【ruby】详解proc与lambda的区别
- Ruby 的 proc 与 lambda