`
vivimusing
  • 浏览: 78213 次
  • 性别: Icon_minigender_1
  • 来自: 台州
社区版块
存档分类
最新评论

lambda 和 Proc.new 的细微区别

阅读更多

 

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更像是在代码中多添加那么几行代码。

分享到:
评论
7 楼 gift5168xf 2010-01-24  
除了next,next是仅仅终止block,并返回它的值。next对所有的定义block的方式都一样。若非要用Proc.new来得到block返回值,而不对它的context有所影响应就应该用next。至于return看这里
6 楼 check 2009-07-17  

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

lambda evaluation以前是作为一种图灵等价提出来的,后来的FP喜欢这种风格。而Proc.new显然是ruby的reflexive一面,两者立足点不同,只是“碰巧”都定义一个过程,实现上有些细微区别,但是我个人认为,即不关键也不值得拿来讨论。反正你编程的时候如果牵涉了这个级别的行为区别,证明你的代码可读性已经出问题了。
5 楼 Hooopo 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 ..


4 楼 ruby-rails 2009-01-30  
<div class="quote_title">vivimusing 写道</div>
<div class="quote_div">
<p> </p>
<pre name="code" class="ruby">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

</pre>
<p> </p>
<p> lambda更像是创建一个佚名的函数。</p>
<p>而Proc.new更像是在代码中多添加那么几行代码。</p>
</div>
<p>什么就是代码中多添加了那麽几行?不懂你的意思<img src="/images/smiles/icon_surprised.gif" alt="" /></p>
<p> </p>
<p>这个例子不就是说明Proc.new在return的时候不会被拦截,lambda会被拦截嘛。</p>
<p> </p>
<p>除了这个,还有个就是检查参数个数和类型的区别。</p>
3 楼 vivimusing 2009-01-30  
楼上的那个例子更能说明我遇到的这个问题吧。
lambda中包含了一个return,把这个佚名函数中断掉,返回到调用这个佚名函数的代码中去;
而Proc.new 中包含一个return,如我那个例子将把some_method中断掉,返回到调用some_method的代码。
2 楼 lgn21st 2009-01-30  
<div class="quote_title">vivimusing 写道</div>
<div class="quote_div">
<p> </p>
<pre name="code" class="ruby">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

</pre>
<p> </p>
<p> lambda更像是创建一个佚名的函数。</p>
<p>而Proc.new更像是在代码中多添加那么几行代码。</p>
</div>
<p> </p>
<p>你的结论"而Proc.new更像是在代码中多添加那么几行代码。"是从何而来?这就是lambda和Proc.new的细微区别么?</p>
<p> </p>
<p>基本上,lambda和proc是一个东西,都是Kernel的方法,他们兄弟俩基本可以等同于跟Proc.new,除了ruby文档上已经提到差别外,还有一点在<a href="http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby">这里</a>的例子中已经说的非常清楚了.</p>
<p> </p>
1 楼 yb31 2009-01-30  
完全看不懂lz这例子想说明什么

相关推荐

Global site tag (gtag.js) - Google Analytics