2006-11-07
Ruby的callback实现
关键字: yield,Ruby
初学Ruby给我留下印象最深的callback的实现,即Ruby的block。它给我的感觉是很新颖,很有想法,也很大胆。
以前我也曾接触过一些其他语言的callback的实现,但都没有真正理解其中的精髓。直到看了Ruby的block,我才突感茅塞顿开,好像积压在心头的一块大石一下子被拿开了一样。Ruby似乎就是为了block而生的(好像有些绝对了,只是为了表达一下喜悦的心情:P)。
下面就是一个Ruby的block的小例子:
结果如下:
hi tracy
它的执行过程是这样的,系统调用SayHello的say_hello方法,并带有一个block,即{}中的代码,以后简称“块”。块中的代码首先被记录下来,然后开始执行say_hello方法,先是将‘hi’赋值给变量hello,接着遇到yield关键字,这时之前被记录下来的块中的代码会将yield取代,而yield后面的变量hello赋给块里||所夹的变量,这时方法say_hello的代码就好像是下面这样:
它所产生的结果会是hi tracy就不难理解了。
我觉得这种机制的新颖之处就在于它将一段代码作为了方法的参数,这样就大大增强了方法的灵活性,而如此灵活的设计并非一定是好事,它就像一把双刃剑,程序员需要理解它更深层次的意思,明白Ruby语言设计者的良苦用心,正确的使用,这样它必将发挥巨大的作用!否则,代码将会复杂难懂,破败不堪。
以前我也曾接触过一些其他语言的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语言设计者的良苦用心,正确的使用,这样它必将发挥巨大的作用!否则,代码将会复杂难懂,破败不堪。
发表评论
- 浏览: 63837 次
- 性别:

- 来自: 深圳

- 详细资料
搜索本博客
我的相册
111
共 1 张
共 1 张
最近加入圈子
最新评论
-
Ubuntu Mobile Edition: ...
是疯狂,不知道什么时候能那个用一用~
-- by nishizhen -
使用XMPP4R在RubyOnRails ...
基本上都是可以的,只是不同的语言对其协议的封装实现不一样而已。原理都是差不多的。 ...
-- by iceskysl -
使用XMPP4R在RubyOnRails ...
想问一下,如果不是ror开发的网站,可以用你说的方法设计机器人吗?如果可以的话, ...
-- by sea gull -
请教一个奇怪的问题:java ...
各位帮忙分析下 :)多谢~
-- by iceskysl -
Rails4Days(ChineseVersio ...
iceskysl 写道phoenixup 写道链接地址已经失效了,如果方便请ma ...
-- by phoenixup






评论排行榜