Ruby | 클래스 메소드 내 super 정보

4532 단어 Ruby

개시하다


본 원고는 super에 관한 것이다.평소에는 실례적인 방법super으로 장면을 찍는다고 생각했는데 학급 방법에서 혼란스러운 상황이 있을 수 있어서 정리해봤습니다.

뭐?


방법으로 super 호출할 때, 부류의 동명 방법을 호출합니다.방법이 없으면 예외가 발생할 수 있다.
class Parent
  def do(something)
    p something
  end
end

class Child < Parent
  def do
    super('something')
  end
end

c = Child.new
실례적인 방법은 사용ancestors을 어떻게 검색하는지 알려 줍니다.앞의 예Child는 반의 상속 관계Parent에 반이 있기 때문에 그곳에서 방법을 찾을 수 있다.
만약 원하는 방법이 Parent반에 없다면 부류를 더 검색하세요.상위 클래스Object를 더 이상 검색하지 않으면 클래스Kernel를 검색합니다.마지막으로BasicObject반이에요.
p Child.ancestors
#=> [Child, Parent, Object, Kernel, BasicObject]

매혹적인 일


나는 업무 중에 pundit의 내용을 조사하여 다음과 같은 기술을 발견하였다.included 모듈이 포함될 때의 호출base에서 클래스를 더욱 확장할 때(클래스 추가 방법 등) 자주 사용한다.
module PolicyExampleGroup
  include Pundit::RSpec::Matchers

  def self.included(base)
    base.metadata[:type] = :policy
    base.extend Pundit::RSpec::DSL
    super # これ
  end
end
그럼 이super는 어떤 종류에서 정의된included 방법일까요?처음부터 ancestors에서 찾아보면 알 수 있을 것 같은데 모듈에 부모님반이 없어요...그래도 예외는 아닌데, 왜?
p Pundit::RSpec::PolicyExampleGroup.ancestors
#=> [Pundit::RSpec::PolicyExampleGroup]
Rubby는 클래스 방법에서 특이류로 정의되기 때문에 클래스 방법에서 사용super하면 검색은 특이류의 계승 관계로 진행된다.
주의해야 할 방법은 실례적인 방법이다
p Pundit::RSpec::PolicyExampleGroup.singleton_class.ancestors
#=> [#<Class:Pundit::RSpec::PolicyExampleGroup>, Module, ..., Kernel, BasicObject]
이번에는 Module반의 실례 방법과 일치하기 때문에 실행하였다.덮어쓰지 않기 nil 는 되돌아오는 방법이기 때문에 삭제할 수 있습니다
우선, 나는 졸렬한 영어로pull request를 만들었는데, 어떻게 될지 모르겠다...

좋은 웹페이지 즐겨찾기