Ruby中的catch和loop

为了了解下bunny的工作模型, 稍微看了看相关的代码, 偶然看到了这么一段:

consumer_work_pool.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def run_loop
    catch(:terminate) do
        loop do
            callable = @queue.pop

            begin
                callable.call
                rescue ::StandardError => e
                # TODO: use connection logger
                $stderr.puts e.class.name
                $stderr.puts e.message
            end
        end
    end
end

里面出现了两个自己比较陌生的关键字: catch, loop. 稍微学习一下;)

有关loop

这个关键字比较简单, 就是一个单纯的无限循环~ 类似于while true; end的简单写法. 在stackoverflow上有这么一个问题, 内容挺不错~

有关catch

看到这个关键字第一反应是处理异常, 应该是和rescue差不多的功能. 但是看到这个之后, 知道catch/throw更像是一个goto语句(速度快).

来个小例子:

catch.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def foo
    loop do
        yield 'Foo'
        throw :bar
        sleep 1
    end

    puts "I'm out of loop"
end

catch :bar do
    foo do |msg|
        puts "Hello #{msg}"
    end
end

puts "end"

程序在执行到throw后便跳出catch的block了, 在某些情况挺好的, 但还是尽量少用吧;)

Comments