2012-05-09 18 views
11
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 

虽然如此,由于Parent类的test方法立即使用return语句,所以不应该可以打印Child类的行。但它确实印刷。这是为什么?Ruby返回语句不适用于super关键字?

Ruby 1.8.7,Mac OSX。

回答

8

super就像调用超类的方法实现的方法调用一样。在你的例子中,return关键字从Parent::test返回,并继续执行Child::test,就像任何其他方法调用一样。

+0

哦..我明白了。但我想知道,我会如何达到我期待的效果? – Voldemort

+7

@Omega尝试'返回超级'。 –

+0

发布一个新问题,并描述你想要完成的事情。 – benzado

11

另一种方式去思考在这种情况下调用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