programing

루비: kind_of? vs. instance_of?vs. is_a?

stoneblock 2023. 6. 3. 08:07

루비: 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"이다.String그리고.String의 하위 클래스입니다.Object.
  • 하지만"hello".instance_of? Object돌아온다false.

무엇이 다른가요?

설명서에서 다음을 참조하십시오.

- (부울) instance_of?(class)
돌아온다 true한다면 obj지정된 클래스의 인스턴스입니다.

그리고:

- (부울) is_a?(class)
- (부울) kind_of?(class)
돌아온다 true한다면 class의 클래스입니다. obj아니면 class의 슈퍼 클래스 중 하나입니다. obj또는 에 포함된 모듈 obj.

만약 그것이 불분명하다면, 정확하게 무엇이 불분명한지 알고 문서를 개선하는 것이 좋을 것입니다.

어떤 것을 언제 사용해야 합니까?

절대로. 대신 다형성을 사용하세요.

왜 이렇게 많아요?

저는 두 개를 "다수"라고 부르지 않을 것입니다.그들은 두 가지 다른 일을 하기 때문에 두 가지가 있습니다.

루비와 유사한 방식으로 객체가 필요한 방식에 응답하는지 여부를 묻는 것입니다.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

https://stackoverflow.com/a/3893305/10392483 좋은 설명입니다... 여기에 색을 더하기 위해, 저는 사용하는 경향이 있습니다.is_a?"기본"의 경우(문자열, 배열, 아마도 해시 등)

그렇게"hello".is_a?(String),[].is_a?(Array),{}.is_a?(Hash)

다른 것들은, 저는 사용하는 경향이 있습니다.instance_of? (Animal.new.instance_of?(Animal)

저는 그것이 그렇게 명확하지 않기 때문에 경향이 있다고 말합니다.예를 들어,

class Animal;end

class Dog < Animal;end

x = Dog.new

x.is_a?(Dog) # => true
x.is_a?(Animal) # => true
x.instance_of?(Dog) # => true
x.instance_of?(Animal) # => false

보시다시피 x는 Dog와 Animal 둘 다지만 Dog의 예에 불과합니다.

저는 그것을 구체성의 문제로 봅니다.

  • 만약 내가 그것이 단지 알고 싶다면.Animal절대로Plant이용하겠습니다is_a?
  • 내가 신경 쓴다면 그것은.Dog절대로Cat이용하겠습니다instance_of?

그런 다음 이 작업을 더 진행할 수 있습니다.내가 신경 쓴다면 그것은.Sighthound절대로Bloodhound다 둘다의 하클가고다정니의 하위 합니다.Dog그러면 좀 더 구체적으로 말씀드리고 싶습니다.

그렇긴 하지만,is_a?(Animal|Dog|Sighthound)항상 작동할 것입니다.하지만 특정 하위 클래스에 관심이 있다면,instance_of?항상 더 구체적입니다.

언급URL : https://stackoverflow.com/questions/3893278/ruby-kind-of-vs-instance-of-vs-is-a