Оператор возврата Ruby не работает с супер ключевым словом?

class Parent
  def test
    return
  end
end

class Child < Parent
  def test
    super
    p "HOW IS THIS POSSIBLE?!"
  end
end

c = Child.new
c.test

Я, тем не менее, потому что метод test из класса Parent сразу использует оператор return, не должно быть возможности распечатать строку класса Child. Но он действительно напечатан. Почему это?

Ruby 1.8.7, Mac OSX.

Ответ 1

super действует как вызов метода, который вызывает реализацию метода суперкласса. В вашем примере ключевое слово return возвращает из Parent::test и продолжает выполнение Child::test, как и любой другой вызов метода.

Ответ 2

Еще один способ подумать о вызове super в этом контексте - это любой другой метод:

class Parent
  def foo
    return
  end
end

class Child < Parent
  def test
    foo
    p "THIS SEEMS TOTALLY REASONABLE!"
  end
end

c = Child.new
c.test
# => "THIS SEEMS TOTALLY REASONABLE!"

Если вы действительно хотите предотвратить вызов p, вам нужно использовать возвращаемое значение из super в условном выражении:

class Parent
  def test
    return
  end
end

class Child < Parent
  def test
    p "THIS SEEMS TOTALLY REASONABLE!" if super
  end
end

c = Child.new
c.test
# => nil