2005-12-23
TAG:Ruby hello_world

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

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

    下面就是一个Rubyblock的小例子:

        class SayHello

                    def say_hello

                                hello = ‘hi ’

                                yield hello

                    end

        end

        SayHello.say_hello{|greeting| print greeting, ‘tracy’}

    结果如下:

        hi tracy

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

        def say_hello

                    hello = ‘hi ’

                    print ‘hi’,’tracy

        end

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

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






夜--- @ 11:45:45 | 引用 0 | 编辑



评论
 
andy.Fang () @ 2009-09-03 09:48:19
把方法当成参数传递,这和Javascript很类似啊.



 
pLatOOn () @ 2007-11-09 11:30:07
java的callback好像是用接口来实现的吧!



 
布尔 () @ 2007-04-14 00:13:24
var o = {

sayHello:function(s,f){

f(s)

}

}



o.sayHello('lisq', function(s){

alert('hello' + s)

})



 
dennis () @ 2006-04-22 10:12:12
你好,看了你的RUBY学习笔记,感觉很不错

我是做JAVA开发的,对ROR很感兴趣,能不能交个朋友?有问题也好请教哦



 
rendong () @ 2006-03-08 11:32:51
能给一个java callback的例子么?谢谢!



 
todayhill () @ 2005-12-23 12:22:51
恩~callback是个很经典的问题,C用函数指针来实现callback,JAVA用接口实现,RUBY用了block,都是很不错的解决方案!



发表评论
 姓名: 
 E-mail: 
 地址: