锁定老帖子 主题:Closure & Block
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-15
在我概念中一直觉得Ruby的Block和C/C++中的函数指针是类似,只是他写法更简单。对于Python和lisp来说function是一等公民,所以也可以实现和Ruby的Block一样的功能。其实对于Java程序员来说,我认为Block更像匿名内部类。今天找到一篇权威的文章http://www.artima.com/intv/closures.html。 该文中提到Closure可以和Block互相转换,而他们的差别就是Closure具有context。不是很理解Closure的含义。目前也暂时想不到什么情况下使用Closure强于使用Block,希望大家share一下。 引用 Bill Venners: Ruby supports blocks and closures. What are blocks and closures, and how are they used? Yukihiro Matsumoto: Blocks are basically nameless functions. You may be familiar with the lambda from other languages like Lisp or Python. Basically, you can pass a nameless function to another function, and then that function can invoke the passed-in nameless function. For example, a function could perform iteration by passing one item at a time to the nameless function. This is a common style, called higher order function style, among languages that can handle functions as first class objects. Lisp does it. Python does it .Even C does it with function pointers. Many other languages do this style of programming. In Ruby, the difference is mainly a different kind of syntax for higher order functions. In other languages, you have to specify explicitly that a function can accept another function as an argument. But in Ruby, any method can be called with a block as an implicit argument. Inside the method, you can call the block using the yield keyword with a value. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-11-15
geradle 写道 该文中提到Closure可以和Block互相转换,而他们的差别就是Closure具有context。不是很理解Closure的含义。目前也暂时想不到什么情况下使用Closure强于使用Block,希望大家share一下。 这个解释是正确的。前几天在编写xruby的builtin时发现编译器的一个bug,把block当成closure来实现了,结果block中的return没有跳出函数作用域,比如下面这段代码: def test 3.times do return end end 在block中,这个return是直接跳出函数的,当时是结束当前循环,所以最终的结果是3次循环都执行了,函数也执行到最后。 |
|
返回顶楼 | |
发表时间:2006-11-15
按照SICP的说法,Closure有两个含义,第一个指的就是离散数学中的定义,大概意思是:
一个定义域和函数集合,使得函数的值域仍然落进定义域。 后来不知道为什么这个词用来形容包含自由变量的函数,这个自由变量就是上面所说的Context。 其实这两个定义没有任何关系。 |
|
返回顶楼 | |
发表时间:2006-11-15
唉,Ruby的Closure,Proc,Block这三个概念太相似了,难于区别,虽然不理解也可以写代码,但是还是理解的好。
|
|
返回顶楼 | |
发表时间:2006-11-16
Here is a MF article about closure
www.martinfowler.com/bliki/Closure.html |
|
返回顶楼 | |
发表时间:2006-11-16
roseanne 写道 Here is a MF article about closure
www.martinfowler.com/bliki/Closure.html roseanne为什么老用英文写呀?计算机输入不了中文么? |
|
返回顶楼 | |
发表时间:2006-11-16
roseanne 写道 Here is a MF article about closure
www.martinfowler.com/bliki/Closure.html 这个文章没有讲三者的差别,只是讲了Closure的作用,Closure的作用我已经理解,其在Python中也有对应的实现。 我现在的疑问是,Ruby中这三个东西到底有什么细微的差别,说实话我觉得有点重复了。所以有点疑惑! |
|
返回顶楼 | |
发表时间:2006-11-17
qiezi was correct.
I read and tested a lot, finally understand the similarity and difference now. Put together an example code, try to run it, you would understand too. The key is return! def test_closure_or_not(closure_or_not) puts puts "before calling closure_or_not" result = closure_or_not.call puts "after calling closure_or_not" puts "result from closure_or_not: #{result}" "test_closure_or_not result" end def test_block(&b) puts puts "before calling block" result = b.call puts "after calling block" puts "result from block: #{result}" "test_block result" end puts "======w/o return======" # all three are fine without return puts "w/o return:" + test_closure_or_not(lambda {"from lambda"}) puts "w/o return:" + test_closure_or_not(Proc.new {"from Proc.new"}) puts "w/o return:" + test_block{"from block"} puts "======w/ return======" # Only lambda is fine with return, # lambda is closure, block and Proc.new are not puts "w/ return:" + test_closure_or_not(lambda {return "from lambda"}) puts "w/ return:" + test_closure_or_not(Proc.new {return "from Proc.new"}) puts "w/ return:" + test_block{return "from block"} |
|
返回顶楼 | |
发表时间:2006-11-17
Pay attention to the comments in code.
Thanks! |
|
返回顶楼 | |
发表时间:2006-11-17
Thanks roseanne. Now, I know the key is return, but I want to ask why?
|
|
返回顶楼 | |