2006-11-07

Ruby的callback实现

关键字: yield,Ruby
初学Ruby给我留下印象最深的callback的实现,即Ruby的block。它给我的感觉是很新颖,很有想法,也很大胆。
以前我也曾接触过一些其他语言的callback的实现,但都没有真正理解其中的精髓。直到看了Ruby的block,我才突感茅塞顿开,好像积压在心头的一块大石一下子被拿开了一样。Ruby似乎就是为了block而生的(好像有些绝对了,只是为了表达一下喜悦的心情:P)。
下面就是一个Ruby的block的小例子:
        class SayHello
                    def say_hello
                         hello = ‘hi ’
                         yield hello
                    end
        end
        SayHello.say_hello{|greeting| print greeting, ‘tracy’}


结果如下:
hi tracy

它的执行过程是这样的,系统调用SayHello的say_hello方法,并带有一个block,即{}中的代码,以后简称“块”。块中的代码首先被记录下来,然后开始执行say_hello方法,先是将‘hi’赋值给变量hello,接着遇到yield关键字,这时之前被记录下来的块中的代码会将yield取代,而yield后面的变量hello赋给块里||所夹的变量,这时方法say_hello的代码就好像是下面这样:
        def say_hello
              hello = ‘hi ’
              print ‘hi’,’tracy’
        end


它所产生的结果会是hi tracy就不难理解了。

我觉得这种机制的新颖之处就在于它将一段代码作为了方法的参数,这样就大大增强了方法的灵活性,而如此灵活的设计并非一定是好事,它就像一把双刃剑,程序员需要理解它更深层次的意思,明白Ruby语言设计者的良苦用心,正确的使用,这样它必将发挥巨大的作用!否则,代码将会复杂难懂,破败不堪。
评论
robbin 2006-11-07
spring的Template大量使用了这种callback机制。
发表评论

您还没有登录,请登录后发表评论

iceskysl
搜索本博客
我的相册
6e4b1028-c838-4ae2-9808-316c7a60e315-thumb
111
共 1 张
最近加入圈子
存档
最新评论