Question

Consider this 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

Can I ignore the exit in class Bar somehow?

It terminates my loop. I don't want that.

Note - the real code base is much larger and more complicated than that. But it boils down to this question whether I can ignore exit() or not.

Was it helpful?

Solution

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

This will print #<SystemExit: exit> in an infinite loop, without ever exiting.

OTHER TIPS

One hackish way to define an exit method in context:

class Bar; def exit; end; end

This works because exit in the initializer will be resolved as self.exit1. In addition, this approach allows using the object after it has been created, as in: b = B.new.

But really, one shouldn't be doing this: don't have exit (or even puts) there to begin with.

(And why is there an "infinite" loop and/or user input in an intiailizer? This entire problem is primarily the result of poorly structured code.)


1 Remember Kernel#exit is only a method. Since Kernel is included in every Object, then it's merely the case that exit normally resolves to Object#exit. However, this can be changed by introducing an overridden method as shown - nothing fancy.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top