Ответ 1
super
действует как вызов метода, который вызывает реализацию метода суперкласса. В вашем примере ключевое слово return
возвращает из Parent::test
и продолжает выполнение Child::test
, как и любой другой вызов метода.
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.
super
действует как вызов метода, который вызывает реализацию метода суперкласса. В вашем примере ключевое слово return
возвращает из Parent::test
и продолжает выполнение Child::test
, как и любой другой вызов метода.
Еще один способ подумать о вызове 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