浏览 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更像是在代码中多添加那么几行代码。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-30
完全看不懂lz这例子想说明什么
|
|
返回顶楼 | |
发表时间: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文档上已经提到差别外,还有一点在这里的例子中已经说的非常清楚了.
|
|
返回顶楼 | |
发表时间:2009-01-30
楼上的那个例子更能说明我遇到的这个问题吧。
lambda中包含了一个return,把这个佚名函数中断掉,返回到调用这个佚名函数的代码中去; 而Proc.new 中包含一个return,如我那个例子将把some_method中断掉,返回到调用some_method的代码。 |
|
返回顶楼 | |
发表时间: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会被拦截嘛。
除了这个,还有个就是检查参数个数和类型的区别。 |
|
返回顶楼 | |
发表时间: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 .. |
|
返回顶楼 | |
发表时间:2009-07-17
最后修改:2009-07-17
我印象里python 3取消了匿名方程,所以我觉得这么钻牛角尖意义不大 lambda evaluation以前是作为一种图灵等价提出来的,后来的FP喜欢这种风格。而Proc.new显然是ruby的reflexive一面,两者立足点不同,只是“碰巧”都定义一个过程,实现上有些细微区别,但是我个人认为,即不关键也不值得拿来讨论。反正你编程的时候如果牵涉了这个级别的行为区别,证明你的代码可读性已经出问题了。 |
|
返回顶楼 | |
发表时间:2010-01-24
最后修改:2010-01-24
除了next,next是仅仅终止block,并返回它的值。next对所有的定义block的方式都一样。若非要用Proc.new来得到block返回值,而不对它的context有所影响应就应该用next。至于return看这里
|
|
返回顶楼 | |