Ruby에서 부모의 클래스 이름을 얻는 방법


86

내가 클래스가 A있고 B어디에 B상속 한다고 가정합시다 A. 부모 클래스 이름을 어떻게 인쇄합니까?B

class A
end

class B < A
end

내가 시도한 몇 가지

>> B.new.class #=> B   #which is correct
>> B.new.parent  #=> Undefined method `parent`
>> B.parent   #=> Object
>> B.parent.class #=> Class

감사 :)


5
이렇게 붙어있을 때 항상 B.methods.sortirb에서 시도하십시오 . 아마도 무언가 당신이 찾는 메소드 이름에 대한 단서를 줄 것입니다.
Ivaylo Strandjev 2013

@IvayloStrandjev 그게 도움이되지 않습니다. 살펴볼 방법이 너무 많습니다. 시간 낭비입니다.
sawa

1
@sawa 사실이 아닙니다. 30 초 걸렸습니다. 다른 사용자가 나보다 빠르지 만 꽤 빠릅니다.
Ivaylo Strandjev 2013

9
@checkit : 훨씬 간단합니다! 8.methods.grep(/class/)당신은 심지어 :) 필터링 이런 종류의 종류에 필요하지 않습니다
세르지오 Tulentsev을

트윗 담아 가기 이 : 정말 도움이 될 것입니다
라훌 Tapali

답변:



62

전체 조상 스택을 원하면 다음을 시도하십시오.

object.class.ancestors

예를 들면 :

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]

1
클래스에 포함 된 모듈도 포함됩니다. Array다음을 볼 수 있습니다.Enumerable부모는 아니지만 Array에 포함 된 모듈이 . 수업 만 원한다면 Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject].
3limin4t0r

18

객체 (Instantiated Class)가 주어지면 부모 클래스를 파생시킬 수 있습니다.

>> x = B.new
>> x.class.superclass.name
=>"A"

16

Google이 Rails에서 일하는 사람을 여기로 데려 오는 경우 대신 원하는 것은 base_classsuperclass ActiveRecord 상속 구조를 통과하는 것처럼 있습니다.

class A < ActiveRecord::Base
end

class B < A
end

> A.superclass
=> ActiveRecord::Base
> B.superclass
=> A

> A.base_class
=> A
> B.base_class
=> A

더 나아가 ...

class C < B
end

> C.base_class
=> A

즉, base_class상속 트리의 맨 위를 제공하지만 애플리케이션의 컨텍스트로 제한됩니다. 하지만 Rails에 관한 한 "귀하의 애플리케이션"에는 사용중인 모든 gem이 포함되어 있으므로 gem에 정의 된 항목을 하위 클래스로 분류하는 모델이있는 경우 사용자가 아닌 base_classgem의 클래스를 반환합니다.


8

찾고있는 용어는 superclass입니다. 그리고 실제로 당신은 할 수 B.superclass얻을 A. ( B.ancestors상속 된 모든 클래스 및 모듈 목록을 가져올 수도 있습니다 [B, A, Object, Kernel, BasicObject]..)


2

상속은 두 클래스 간의 관계입니다. 상속은 클래스간에 부모 자식 관계를 만듭니다. 이는 코드 재사용을위한 메커니즘이며 공개 클래스 및 인터페이스를 통해 원래 소프트웨어의 독립적 인 확장을 허용하는 메커니즘입니다. 상속의 이점은 계층 아래의 클래스가 상위 계층의 기능을 가져 오지만 고유 한 특정 기능을 추가 할 수도 있다는 것입니다. .

Ruby에서 클래스는 하나의 다른 클래스에서만 상속 할 수 있습니다. (즉, 클래스는 다른 클래스에서 상속 된 다른 클래스에서 상속되는 클래스에서 상속 할 수 있지만 단일 클래스는 한 번에 여러 클래스에서 상속 할 수 없습니다.) BasicObject 클래스는 Ruby의 모든 클래스의 상위 클래스입니다. 따라서 명시 적으로 재정의하지 않는 한 모든 개체에서 해당 메서드를 사용할 수 있습니다.

Ruby는 mixin을 사용하여 단일 클래스 상속을 한 번에 극복합니다.

예를 들어 설명하겠습니다.

module Mux
 def sam
  p "I am an module"
 end
end
class A
  include Mux
end
class B < A
end
class C < B
end
class D < A
end

class_name.superclass.name을 사용하여 추적 할 수 있으며이 계층에서 BasicOject를 찾지 못한 경우이 프로세스를 수행 할 수 있습니다. BasicObject는 모든 클래스의 슈퍼 클래스입니다. 클래스 C 계층 트리를보고 싶다고 가정 해 보겠습니다.

 C.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

클래스 C의 전체 계층 구조를 볼 수 있습니다.이 방법을 사용하면 부모 클래스에 포함되거나 앞에 추가 된 모듈을 찾을 수 없습니다.

모듈을 포함하여 완전한 계층 구조를 찾는 또 다른 방법이 있습니다. Ruby doc ancestors 에 따르면 . mod에 포함 / 앞에 추가 된 모듈 목록을 반환합니다 (mod 자체 포함).

C.ancestors
 => [C, B, A, Mux, Object, Kernel, BasicObject]

여기서 Mux와 Kernel은 모듈입니다.

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.