2017-03-31 6 views
0

"포괄적 인 루비 프로그래밍 과정" 전자 북 하위 클래스 메소드가 부모 메소드를 확장 할 때가 있습니다. 나는 그것이 어떻게 작동하는지 완전히 인식하지 오전 :스 플랫을 사용하여 수퍼를 사용하는 루비 확장 메소드

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은 부모에가 무엇 이건 방법을 확장 지시, 왜 이러한 플랫 인수가 필요? 매개 변수 목록에서

+0

해결책을 시도 했습니까? splat args가 필요한 이유를 정확하게 알려주는 오류가 발생합니다. – meagar

답변

2

**args 단순히 "모든 여분의 키워드 인수를 가져와 해시에 넣어, args라고"를 의미한다.

반대로, **args 메소드를 호출 반대를 않습니다 - 을 "이 해시 args라고 얻고 그 해시에서 해당 이름과 값을 키워드 인수를 전달". 인수없이


super 자식 방법은 접수 된 모든 인수를 전달하려고합니다. 그러므로 부모님이 기대하지 않았던 추가 금액이 있다면 ArgumentError이됩니다.

예를 들어, 부모는 foo:bar: 뿐이며 자식도 buzz:입니다.