Ruby Kernel#trap 的返回值 (问题解决)

goinaction · 2013年07月10日 · 最后由 goinaction 回复于 2013年09月10日 · 3147 次阅读

Ruby的文档里面对于Kernel#trap的描述里面有一句:

trap returns the previous handler for the given signal.

这具体是啥意思呢?

主要是今天看到working with unix processes里面有这么一段代码

trap(:INT) { puts 'This is the first signal handler' }

old_handler = trap(:INT) { old_handler.call puts 'This is the second handler' exit } sleep

应该就是利用了 trap 返回上一次的 handler 的功能。但是为啥会是这种类似递归的形式呢?

求大神解答😄

不是递归呀

#1 楼 @luikore 但是看起来像是递归,也许是我对 block 理解不够

#2 楼 @goinaction 递归是调用链里会调用回自己,但这里只是新的 handler 调用了旧的 handler, 两个 handler 都不会调用到自己。

trap 同一个信号会覆盖旧 handler, 如果不想丢掉旧 handler, 就在新 handler 里调一下旧的。为了让你方便找到旧 handler, trap 返回上一次的 handler 而不是这一次的。

#3 楼 @luikore 明白了,这应该算是利用了闭包的特性吧?

#4 楼 @goinaction en, 是的,这里 old_handler 是个闭包变量

#5 楼 @luikore 了然,看来还是对 block,闭包啥的不够熟悉啊。

#6 楼 @goinaction 这不是对闭包不熟悉,是对 trap 这个 api 不熟悉

#7 楼 @fsword 嗯嗯,当时确实没想明白。用了几次就容易理解了 几个月前的帖子还麻烦你回复了😄

需要 登录 后方可回复, 如果你还没有账号请 注册新账号