2017-03-31 74 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: