루비 슈퍼 키워드
내가 이해하는 바에 따르면 super
키워드는 현재 클래스의 수퍼 클래스에서 현재 메소드와 동일한 이름을 가진 메소드를 호출합니다. autoload
메서드 아래 에는 super
. 동일한 이름의 메서드를 사용 하는 수퍼 클래스 또는 super
여기 에서 수행 하는 호출이 무엇인지 알고 싶습니다.
module ActiveSupport
module Autoload
...
def autoload(const_name, path = @@at_path)
full = [self.name, @@under_path, const_name.to_s, path].compact.join("::")
location = path || Inflector.underscore(full)
if @@eager_autoload
@@autoloads[const_name] = location
end
super const_name, location
end
....
end
end
module ActiveRecord
extend ActiveSupport::Autoload
...
autoload :TestCase
autoload :TestFixtures, 'active_record/fixtures'
end
이 코드는 레일스 마스터 브랜치에서 레일스 마스터입니다. 고맙습니다.
Ruby 문서에서 super
키워드에 대해 예시 :
module Vehicular
def move_forward(n)
@position += n
end
end
class Vehicle
include Vehicular # Adds Vehicular to the lookup path
end
class Car < Vehicle
def move_forward(n)
puts "Vrooom!"
super # Calls Vehicular#move_forward
end
end
조상 검사
puts Car.ancestors.inspect
# Output
# [Car, Vehicle, Vehicular, Object, Kernel, BasicObject]
Vehicular
Module
개체 포함 에 유의하십시오 !
상속 체인을 확인 objRef.class.ancestors
하거나 ClassName.ancestors
알고 있습니다. 수퍼 클래스에 메소드가 포함되지 않은 경우 수퍼 클래스에 포함 된 모든 모듈이 검사됩니다 (마지막 포함 된 모듈이 먼저 검사 됨). 일치하지 않는 조직 조부모 클래스로 한 단계 위로 이동합니다.
조상 목록을 사용할 다음 호출 AncestorClass.methods.select{|m| m.include?("auto_load")}
되는 메서드에서 영역 을 호출 할 수 있습니다 .
(참고 : 위의 코드는 Ruby 1.8입니다. 1.9에서는 methods
대신 기호를 사용하여 수행해야합니다. m.to_s.include?(...
)
들어 올립니다 사용
binding.pry
를 사용하기 직전 에 호출을 삽입 한 super
다음 show-source -s
( -s
means superclass
)를 호출 하여 수퍼 클래스 메서드를 표시하고 정의 된 위치를 찾습니다.
class A
def hello
puts "hi"
end
end
class B < A
def hello
binding.pry
super
end
end
b = B.new
b.hello
From: (pry) @ line 7 B#hello:
7: def hello
=> 8: binding.pry
9: super
10: end
[1] (pry) #<B>: 0> show-source -s
From: (pry) @ line 2:
Number of lines: 3
Owner: A # <--see owner here (i.e superclass)
Visibility: public
def hello
puts "hi"
end
[2] (pry) #<B>: 0>
이 super
키워드는 상속 된 메서드를 찾기 위해 조상 트리를 끝까지 확인합니다.
레일스 마스터 브랜치 전체를 검색하십시오. def autoload
에서보고있는 것과 정확히 일치하는 것만 찾을 수 있습니다 active_support/lib/active_support/dependencies/autoload.rb
.
재정의되는 메서드는 기본 Ruby입니다. 그것은Module#autoload
내 .irbrc에 메서드의 소유자를 찾기 위해이 메서드를 추가했습니다. 특히 싱글 톤 클래스의 슈퍼 클래스가 슈퍼 클래스의 싱글 톤 클래스 인 싱글 톤 메서드를 처리 할 때 더 나은 방법을 볼 수 있습니까?
class Object
def find_method(method_string)
if klasses = self.class.ancestors.select { |a| a if a.methods.include? method_string }
puts "class method in #{klasses.join(',')}" unless klasses.empty?
end
if klasses = self.class.ancestors.select { |a| a if a.instance_methods.include? method_string }
puts "instance method in #{klasses.join(',')}" unless klasses.empty?
end
rescue
raise "owning class not found"
end
end
관련 수퍼 클래스 메소드는 아마도 Module # autoload 입니다.
참조 URL : https://stackoverflow.com/questions/2597643/ruby-super-keyword
'ProgramingTip' 카테고리의 다른 글
Sequel Pro에서 쿼리를 어떻게 실행합니까? (0) | 2020.12.25 |
---|---|
HTTP 기본 인증을위한 순수 자바 스크립트 코드? (0) | 2020.12.25 |
메타 클래스 다중 상속 불일치 (0) | 2020.12.25 |
하위 디렉토리 및 Makefile (0) | 2020.12.25 |
Bash 펼쳐지는 명령 출력을 변수에 저장합니다. (0) | 2020.12.25 |