Ruby - 忽略代码中的“退出”

时间:2013-12-31 23:18:39

标签: ruby exit

考虑以下代码:

class Bar
  def initialize
    puts 'Hi from class Bar.'
    exit
  end
end


class Foo
  def initialize
    loop {
      case $stdin.gets.chomp
      when 'foo'
        puts 'Hi from class Foo.'
      when 'bar'
        Bar.new
      end
    }
  end
end

我能以某种方式忽略班级栏中的退出吗?

它终止了我的循环。我不想要那个。

注意 - 真正的代码库比这个更大,更复杂。但归结为这个问题我是否可以忽略exit()。

2 个答案:

答案 0 :(得分:6)

loop {
  begin
    Bar.new
  rescue SystemExit
    p $!  #: #<SystemExit: exit>
  end
}

这将在无限循环中打印#<SystemExit: exit>,而不会退出。

答案 1 :(得分:2)

在上下文中定义exit方法的一种hackish方式:

class Bar; def exit; end; end

这是有效的,因为初始值设定项中的exit将被解析为self.exit 1 。此外,此方法允许在创建对象后使用该对象,如:b = B.new

但实际上,一个不应该这样做:开始时没有exit(甚至puts)。

(为什么intiailizer中存在“无限”循环和/或用户输入?这整个问题主要是结构不良的结果。)


1 请记住Kernel#exit 方法。由于内核包含在每个对象中,因此exit通常会解析为Object#exit。但是,这可以通过引入一个如图所示的重写方法来改变 - 没什么特别的。