考虑以下代码:
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()。
答案 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
。但是,这可以通过引入一个如图所示的重写方法来改变 - 没什么特别的。