루비: 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
'programing' 카테고리의 다른 글
해시 키를 다른 키로 대체하려면 어떻게 해야 합니까? (0) | 2023.06.03 |
---|---|
레일 매개 변수가 설명되었습니까? (0) | 2023.06.03 |
명령 프롬프트에서 apk 파일을 설치하시겠습니까? (0) | 2023.06.03 |
Android에서 INSTALL_FAILED_INSUFFICY_STORIAGE 오류에 대한 솔루션 (0) | 2023.06.03 |
VB에 모든 양식의 기본 인스턴스가 있는 이유는 무엇입니까?망은 있지만 C#에는 없습니까? (0) | 2023.06.03 |