2016-01-11 87 views
0

我有以下代碼:`super(argument)`中的`argument`做了什麼?

class Bicycle 
    attr_reader :gears, :wheels, :seats 
    def initialize(gears = 1, wheels = 2) 
    @gears = gears 
    @wheels = wheels 
    @seats = 1 
    end 
end 

b = Bicycle.new 
b.gears # => 1 
b.wheels # => 2 
b.seats # => 1 

class Tandem < Bicycle 
    def initialize(gears) 
    super(gears) 
    @seats = 2 
    end 
end 

t = Tandem.new(2) 
t.gears # => 2 
t.wheels # => 2 
t.seats # => 2 

,當我刪除supert.gearst.wheels返回nil預期。

但是,無論我運行的是super(gears)還是super,代碼都會返回相同的結果。 super(argument)中的argument是做什麼的?當我輸入super(argument)super時,會發生什麼情況?

+0

參考上述代碼:http://rubylearning.com/satishtalim/ruby_overriding_methods.html – Iggy

+1

'super(argument)'用給定'argument'調用相應的父類'方法。在這個特定的情況下,它調用父類'initialize(argument)'。 'super'沒有參數,它調用沒有參數的父類方法。 – lurker

+0

這是否意味着如果父類具有'arg1,arg2,arg3',並且在子類class super(arg1,arg2)上''''arg3'將會在子類中返回'nil'? – Iggy

回答

4

其實,這個問題的評論是不正確的。以下是super所做的準確描述。

如果使用參數調用(如上所述),它會將這些參數傳遞給父類中的重寫方法,而不管傳遞給子類中的重寫方法的參數。例如:

class Parent 
    def test(*args) 
    puts "Args: #{args}" 
    end 
end 

class Child < Parent 
    def test(*args) 
    super('hello') 
    end 
end 

Child.new.test 
'Args: [hello]' 
=> ... 

如果super被稱爲不帶任何參數,參數被隱式地從孩子的方法通過。例如:

class Parent 
    def test(*args) 
    puts "Args: #{args}" 
    end 
end 

class Child < Parent 
    def test(*args) 
    super 
    end 
end 

Child.new.test('arg1', 'arg2') 
'Args: [arg1, arg2]' 
=> ... 

希望清除它!

1

默認情況下超級會將當前方法的參數發送給父方法。

super(arg1,arg2)將在發送到父方法時覆蓋當前方法params。

相關問題