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를 만들었는데, 어떻게 될지 모르겠다...
Reference
이 문제에 관하여(Ruby | 클래스 메소드 내 super 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/guppy0356/items/4cc0025c314ca1404658
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
방법으로
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를 만들었는데, 어떻게 될지 모르겠다...
Reference
이 문제에 관하여(Ruby | 클래스 메소드 내 super 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/guppy0356/items/4cc0025c314ca1404658
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
module PolicyExampleGroup
include Pundit::RSpec::Matchers
def self.included(base)
base.metadata[:type] = :policy
base.extend Pundit::RSpec::DSL
super # これ
end
end
p Pundit::RSpec::PolicyExampleGroup.ancestors
#=> [Pundit::RSpec::PolicyExampleGroup]
p Pundit::RSpec::PolicyExampleGroup.singleton_class.ancestors
#=> [#<Class:Pundit::RSpec::PolicyExampleGroup>, Module, ..., Kernel, BasicObject]
Reference
이 문제에 관하여(Ruby | 클래스 메소드 내 super 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/guppy0356/items/4cc0025c314ca1404658텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)