[英]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.