2017-03-31 101 views
0

「綜合Ruby編程課程」電子書我有一個情況下,當子類方法擴展父母的方法擴展方法具有超強。我並不完全清楚它是如何工作:紅寶石 - 使用圖示

class Parent 
    def initialize(foo:, bar:) 
    @foo = foo 
    @bar = bar 
    end 
end 

class Child < Parent 
    def initialize(buzz:,**args) 
    super(**args) 
    @buzz = buzz 
    end 
end 

我不能完全理解爲什麼我們在這裏使用圖示 - **args。 在這裏def initialize(buzz:,**args)我們只是告訴initialize採取未知數量的鍵值參數,對不對?但究竟是什麼意思super(**args)。告訴方法從超類方法中獲取這些鍵值參數?爲什麼不只是這樣的:

class Child < Parent 
    def initialize(buzz:) 
    super 
    @buzz = buzz 
    end 
end 

畢竟,super講述與任何有父擴展方法,那麼,爲什麼這些圖示ARGS需要的?

+0

你*嘗試*你的解決方案?你會得到一個錯誤,應該告訴你爲什麼需要splat參數。 – meagar

回答

2

**args在參數列表中僅僅意味着「獲取所有額外的關鍵字參數並將它們放在散列中,稱爲args

相反,**args調用方法時,則正好相反 - 「得到這個哈希稱爲args並通過關鍵字參數與散列相應的名稱和值」


super不帶參數將試圖通過孩子的方法收到的所有參數。因此,如果你有額外的父母沒有預料到的,你會得到一個ArgumentError

在你的例子中,父母預計只有foo:bar:,而孩子也有buzz: