2017-03-31 13 views
0

「包括的なRubyプログラミングコース」 e-book子クラスメソッドが親メソッドを拡張する場合があります。私はそれがどのように機能するかを完全に認識していないです:スプラットを使用したスーパーを使った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)を意味します。スーパークラスメソッドからkey-value引数を取るようにメソッドに指示するには?なぜだけではなく、次のように:すべての後に

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

superが親である、なぜこれらのスプラットの引数が必要なものは何でもしてメソッドを拡張するように指示しますか?パラメータリスト内

+0

解決策を試しましたか?スプラット引数が必要な理由を正確に伝えるエラーが表示されます。 – meagar

答えて

2

**args単には意味「すべての余分なキーワード引数を取得し、ハッシュに入れ、argsと呼ばれます」。

逆に、**argsメソッドを呼び出して、反対をして - を「このハッシュはargsと呼ば取得し、そのハッシュから対応する名前と値をキーワード引数を渡す」


super引数なしでは、子メソッドが受け取ったすべての引数を渡そうとします。したがって、親が期待していなかった余分があれば、ArgumentErrorが得られます。

あなたの例では、親はfoo:bar:しか期待していませんが、子供もbuzz:です。

関連する問題