Ruby的callback实现

上一篇 / 下一篇  2007-08-20 21:18:30 / 个人分类:ruby on rails

 初学Ruby给我留下印象最深的callback的实现,即Rubyblock。它给我的感觉是很新颖,很有想法,也很大胆。

    以前我也曾接触过一些其他语言的callback的实现,但都没有真正理解其中的精髓。直到看了Rubyblock,我才突感茅塞顿开,好像积压在心头的一块大石一下子被拿开了一样。Ruby似乎就是为了block而生的(好像有些绝对了,只是为了表达一下喜悦的心情P)。Wish-Space#wql Lnu {

    下面就是一个Rubyblock的小例子:Wish-SpacePfrF:\9u Eq

        class SayHelloWish-Space/iNA,RW

                   def say_hello

"H^?mR1@1~0

                               hello = ‘hi ’Wish-Space.X3dm"x-w M8L _q

                               yield hello

a3s&NO&`0

                    end

7n%Xms)xB w2XL0

        end

\o'c2n+p8r4_0

        SayHello.say_hello{|greeting| print greeting, ‘tracy’}Wish-Spacea2k0J-f/F|

    结果如下:Wish-Space TTk!H [pP4z^#t

        hi tracyWish-SpaceL0`y9d6a%AX"Q

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

C7nX)}0[0

        def say_hello

Tz'iyON[&I0

                   hello = ‘hi ’

-OFt8xG0

                   print ‘hi’,’tracy

t8fkDs&@|7Y;L0

        end

XB Q-NnPf0

    它所产生的结果会是hi tracy就不难理解了。Wish-SpaceR M+B,H/t fE

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


TAG:

引用 删除 hehe   /   2008-02-28 17:31:41
写错了
真爱无敌 引用 删除 浅秋   /   2007-08-21 13:55:46
5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

关于作者