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