繁体   English   中英

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

[英]Ruby - ignore “exit” in code

考虑以下代码:

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

我可以以某种方式忽略Bar类的退出吗?

它终止了我的循环。 我不要

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

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

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

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

class Bar; def exit; end; end

之所以有效,是因为初始化程序中的exit将被解析为self.exit 1 另外,这种方法允许在对象创建后使用它,如: b = B.new

但实际上, 应该这样做:首先不要exit (甚至puts )。

(以及为什么intiailizer中会出现“无限”循环和/或用户输入?整个问题主要是代码结构不良的结果。)


1记住Kernel#exit 只是一种方法。 由于内核包含在每个对象中,因此仅exit通常会解析为Object#exit 但是,可以通过引入如图所示的覆盖方法来更改它-没什么花哨的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM