루비 : kind_of? vs. instance_of? vs_is_a?


487

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


18
is_a?그리고 kind_of?존재 하는지에 관해서는 : Ruby의 디자인 철학의 일부라고 생각합니다. 파이썬은 무언가를 할 수있는 유일한 방법이 있다고 말합니다. 루비에는 종종 동의어가 있으므로 더 나은 소리를 사용할 수 있습니다. 그것은 선호의 문제입니다. 그것은 일본의 영향 때문일 수 있습니다. 나는 그들이 더 좋은 소리를 내기 위해 문장에 따라 같은 숫자로 다른 단어를 사용할 것이라고 들었습니다. Matz는 그 아이디어를 그의 언어 디자인에 적용했을 수도 있습니다.
Nathan Long

@NathanLong 나는 일본 카운터가 그것과 관련이 있다고 생각하지 않습니다. 모든 언어에는 일종의 동의가 있으므로 하나의 카운터를 다른 카운터로 대체 할 수 없습니다 (예 : 평평한 물체에 실린더 카운터를 사용할 수는 없습니다). 그리고 그것은 euphony보다 의미와 관련이 있습니다.
Casey

답변:


621

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

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

예:

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

77
때로는 더 잘 읽습니다. 생각 @honda.kind_of? Car하고 @person.is_a? Administrator, 루비는 미학에 관한 모든 것입니다. 실제로, 문법적인 오류에 주목하십시오. 적극적인 지원으로 다음과 같이 쓸 수 있습니다 :) ... @person.is_an? Administrator실제로 루비 코어로 만들었을 것입니다.
rfunduk

2
그는 흥미로운 이유입니다. 이걸 끊을 수있어? 좋아 kind_of?하지만 무시할 수는 is_a?없습니까?
Claudiu

3
@thenduks is_an?는 루비 -1.9.2 -p0에 없습니다. @ 클라우드, 아니. is_a?의 별칭 일뿐입니다kind_of? . 두 메소드 모두 동일한 c 함수를 호출합니다 rb_obj_is_kind_of.
ma11hew28

9
@Matt : 별칭 기능을 재정의하지 않고 별칭을 무시할 수 있습니다. 예, 재정의 kind_of?하지 않고 재정의 할 수 있습니다 is_a?.
sepp2k

4
이 ActiceSupport is_an?방법 은 어디에 있습니까 ?! 현재 레일 버전이 아니므로 Google에서 더 이상 사용되지 않는 항목을 찾을 수 없습니다.
Tom Lord

22

차이점은 무엇입니까?

설명서에서 :

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

과:

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

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

언제 사용해야합니까?

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

왜 그렇게 많은가?

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


3
내 혼란은 3이 있고 2는 같은 일을하고 이름이 다르다는 것입니다. 다형성 사용에 대해-동의하지만 루비 표준 라이브러리는 이들 각각의 용도로 가득합니다
Claudiu

4
다형성이란 무엇을 의미합니까? 오리 타이핑과 동일합니까?
Andrew Grimm

2
예, 동일합니다. 오리 타이핑은 다형성의 한 형태입니다.
SpaceGhost

3
다형성을 수행하는 것이 더 낫습니다. 예. 파일을 처리 할 때와 같이 특정 클래스가 있다는 것을 실제로 알고 싶은 경우가 있습니다.
Automatico

6

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

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


5
상황에 따라 다릅니다. 댓글과 블로그 모두 created_at에 응답 할 수 있습니다. 그런 상황에서 is_a? 더 적절한 IMHO
penkovsky

Comment와 Blog 객체를 서로 구별해야하는 경우에는 이해가되지 않습니다. 단순히 created_at를 사용하지 않아도됩니다. 그것은 created_at에 응답하는 객체를 취하는 메소드를 작성할 수 있다는 것을 배제하지 않습니다. 작업을 수행하기 위해 다른 작업이 필요하지 않은 경우 주석 또는 블로그 또는 다른 ActiveRecord 모델에서 안전하게 사용할 수 있습니다.
Kingdon

3

나는 또한이 개 많은 전화 (하지 않을 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

1
덕분에 - 내가 참으로 "어떤 런타임 타입 정보 루비에 모여 어떻게 할 수있다"일반적인 의미에서 요구되었다 -이 충분한 예제를 제공합니다
Claudiu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.