论坛首页 编程语言技术论坛

lambda 和 Proc.new 的细微区别

浏览 4974 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-29   最后修改:2009-03-19

 

def some_method
	lambda_proc = lambda { return "from lambda"}
	
	proc_new_proc = Proc.new { return "from Proc.new"}
	
	lambda_proc.call
	proc_new_proc.call
end

puts some_method

#得到个结果是:
#from Proc.new

 

 lambda更像是创建一个佚名的函数。

而Proc.new更像是在代码中多添加那么几行代码。

   发表时间:2009-01-30  
完全看不懂lz这例子想说明什么
0 请登录后投票
   发表时间:2009-01-30  
vivimusing 写道

 

def some_method
	lambda_proc = lambda { return "from lambda"}
	
	proc_new_proc = Proc.new { return "from Proc.new"}
	
	lambda_proc.call
	proc_new_proc.call
end

puts some_method

#得到个结果是:
#from Proc.new

 

 lambda更像是创建一个佚名的函数。

而Proc.new更像是在代码中多添加那么几行代码。

 

你的结论"而Proc.new更像是在代码中多添加那么几行代码。"是从何而来?这就是lambda和Proc.new的细微区别么?

 

基本上,lambda和proc是一个东西,都是Kernel的方法,他们兄弟俩基本可以等同于跟Proc.new,除了ruby文档上已经提到差别外,还有一点在这里的例子中已经说的非常清楚了.

 

0 请登录后投票
   发表时间:2009-01-30  
楼上的那个例子更能说明我遇到的这个问题吧。
lambda中包含了一个return,把这个佚名函数中断掉,返回到调用这个佚名函数的代码中去;
而Proc.new 中包含一个return,如我那个例子将把some_method中断掉,返回到调用some_method的代码。
0 请登录后投票
   发表时间:2009-01-30  
vivimusing 写道

 

def some_method
	lambda_proc = lambda { return "from lambda"}
	
	proc_new_proc = Proc.new { return "from Proc.new"}
	
	lambda_proc.call
	proc_new_proc.call
end

puts some_method

#得到个结果是:
#from Proc.new

 

 lambda更像是创建一个佚名的函数。

而Proc.new更像是在代码中多添加那么几行代码。

什么就是代码中多添加了那麽几行?不懂你的意思

 

这个例子不就是说明Proc.new在return的时候不会被拦截,lambda会被拦截嘛。

 

除了这个,还有个就是检查参数个数和类型的区别。

0 请登录后投票
   发表时间:2009-07-14   最后修改:2009-07-14
额,其实1.8.6里面proc和lambda的是一个意思...1.9改成了proc和Proc.new一个意思.
proc和lambda的行为方式更像是方法(method-like),而Proc.new的行为方式更像是Block(block-like),就是楼主说的更像是在那加几坨代码,但楼主的例子并不能说明这个...
proc和lambda的细微差别除了lgn21st给的链接里面写的对return的处理有区别还体现在对break的处理有区别..

def foo
 block_like = Proc.new{break "break!"}
 block_like.call
 puts "code here.."
end

# => proc_lambda.rb:2:in `call': break from proc-closure (LocalJumpError)
def bar
 method_like = lambda{break "break!"}
 method_like.call
 puts "code here .."
end
# => code here ..


0 请登录后投票
   发表时间:2009-07-17   最后修改:2009-07-17

我印象里python 3取消了匿名方程,所以我觉得这么钻牛角尖意义不大

lambda evaluation以前是作为一种图灵等价提出来的,后来的FP喜欢这种风格。而Proc.new显然是ruby的reflexive一面,两者立足点不同,只是“碰巧”都定义一个过程,实现上有些细微区别,但是我个人认为,即不关键也不值得拿来讨论。反正你编程的时候如果牵涉了这个级别的行为区别,证明你的代码可读性已经出问题了。
0 请登录后投票
   发表时间:2010-01-24   最后修改:2010-01-24
除了next,next是仅仅终止block,并返回它的值。next对所有的定义block的方式都一样。若非要用Proc.new来得到block返回值,而不对它的context有所影响应就应该用next。至于return看这里
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics