当前位置: 代码迷 >> 综合 >> ruby Proc Lambda
  详细解决方案

ruby Proc Lambda

热度:10   发布时间:2023-12-09 08:51:53.0


Proc 与 Lambda的区别

1、代码块、procs和lambda中的return语句

在一个代码块中的return语句不仅仅会从掉哦你该代码块的迭代器返回,它还会从调用迭代器的方法返回。

[ruby] view plain copy
  1. def test  
  2.     puts "entering method"  
  3.     1.times {puts "entering block"return}  
  4.     puts "exiting method"         #this line is never executed  
  5. end  
  6.   
  7. test  
proc与代码块类似,如果调用的proc执行一个return语句,它会试图从代码块所在的方法返回。
[ruby] view plain copy
  1. def test  
  2.     puts "entering method"  
  3.     p = Proc.new {puts "entering proc"return}  
  4.   
  5.         p.call  
  6.     puts "exiting method"         #this line is never executed  
  7. end  
  8.   
  9. test  
但是,lambda中的语句仅仅从lambda自身返回。
[ruby] view plain copy
  1. def test  
  2.     puts "entering method"  
  3.     p = -> {puts "entering lambda"return}  
  4.     p.call  
  5.     puts "exiting method"         #this line is  executed  
  6. end  
  7.   
  8. test  


[ruby] view plain copy
  1. def lambdaBuilder(msg)  
  2.     ->{puts msg; return}  
  3. end  
  4.   
  5. def test  
  6.     puts "entering code"  
  7.     l = lambdaBuilder("hello world")  
  8.     l.call  
  9.     puts "exiting code"   # this line is executed  
  10. end  
  11.   
  12. test  

2、break语句

proc中调用break语句,会是该代码块返回到它的迭代器,然后该迭代器再返回到它的调用方法。

[ruby] view plain copy
  1. def iterator(&proc)  
  2.     puts "entering iterator"  
  3.     proc.call  
  4.     puts "exitring iterator"   #this line is not executed  
  5. end  
  6.   
  7. def test  
  8.     iterator {puts "entering proc"break}  
  9. end  
  10.   
  11. test  

lambda中调用break语句,只是从lambda自身返回。

下面例子这种情况下,break和return语句一样。

[ruby] view plain copy
  1. def test  
  2.     puts "entering test method"  
  3.     lambda = -> {puts "enterting lambda";break;puts "exitring lambda"}  
  4.     lambda.call  
  5.     puts "exitng test method"  
  6. end  
  7.   
  8. test        
  9. # =>entering test method  
  10. # =>entering lambda  
  11. # => exiting test method  

3、顶级的next语句在代码块、proc和lambda中有相同的行为:它使调用代码块、proc和lambda的yield语句或call返回。

redo在proc和lambda中也有相同的行为,它让控制流转向proc和lambda的开始处。

4、传给proc和lambda的参数

调用proc使用的是yield语义,而调用lambda使用的是invocation语义。

proc实例:

[ruby] view plain copy
  1. p = Proc.new {|x,y|  print x,y}  
  2. p.call(1)         # 1 nil  
  3. p.call(1,2)      # 1,2  
  4. p.call(1,2,3)   # 1,2  extral rvalue discarded  
  5. p.call([1,2])   #1,2   array automatically unpacked  
  6. p.call([1,2,3,4])   # 1,2   

lambda实例:
[ruby] view plain copy
  1. puts "lambda******************************"  
  2. l = ->(x,y){ print x,y }  
  3. #l.call(1)   #wrong number of arguments (1 for 2) (ArgumentError)  
  4. l.call(1,2)   # this works  
  5. #l.call(1,2,3) #wrong number of arguments (3 for 2) (ArgumentError)  
  6. #l.call([1,2])  #wrong number of arguments (1 for 2) (ArgumentError)