[ruby] 루비 : kind_of? vs. instance_of? vs_is_a?

차이점은 무엇입니까? 언제 사용해야합니까? 왜 그렇게 많은가?



답변

kind_of?그리고 is_a?동의어입니다.

instance_of?true객체가 서브 클래스가 아닌 정확한 클래스의 인스턴스 인 경우 에만 반환한다는 점에서 다른 두 개와 다릅니다 .

예:

  • "hello".is_a? Object"hello".kind_of? Object반환 true하기 때문에이 "hello"이다 StringString의 서브 클래스입니다 Object.
  • 그러나를 "hello".instance_of? Object반환합니다 false.

답변

차이점은 무엇입니까?

설명서에서 :

-( 부울 )instance_of?(class)
주어진 클래스의 인스턴스 true인지 여부를 반환 합니다 obj.

과:

-( 부울 ) is_a?(class)
-( 부울 )kind_of?(class)
반환 true하는 경우 class의 클래스 인 obj경우, 또는이 class의 상위 클래스 중 하나 obj에 포함 또는 모듈 obj.

즉 불분명 경우, 무엇을 알고 좋을 것이다 정확하게 문서를 향상시킬 수 그래서, 불분명하다.

언제 사용해야합니까?

못. 대신 다형성을 사용하십시오.

왜 그렇게 많은가?

내가 전화하지 않을 “다”. 두 가지 다른 일을하기 때문에 두 가지가 있습니다.


답변

객체를 사용하여 필요한 메소드에 응답하는지 여부를 묻는 것이 Ruby와 비슷합니다 respond_to?. 이를 통해 최소한의 인터페이스와 구현을 인식하지 못하는 프로그래밍이 가능합니다.

물론 항상 적용 가능한 것은 아니므로, 요청하는 방법을 사용하여 클래스 또는 기본 클래스 인 “유형”에 대한보다 보수적 인 이해를 요구할 가능성이 여전히 있습니다.


답변

나는 또한이 개 많은 전화 (하지 않을 is_a?kind_of?같은 방법의 별명이다)하지만, 더 많은 가능성을 볼에 관심을 설정하려면 #class방법 :

A = Class.new
B = Class.new A

a, b = A.new, B.new
b.class < A # true - means that b.class is a subclass of A
a.class < B # false - means that a.class is not a subclass of A
# Another possibility: Use #ancestors
b.class.ancestors.include? A # true - means that b.class has A among its ancestors
a.class.ancestors.include? B # false - means that B is not an ancestor of a.class


답변