다음보다 더 관용적 인 것이 있습니까?
foo.class == String
답변
나는 당신이 찾고 있다고 생각합니다 instance_of?
. is_a?
및 kind_of?
파생 클래스의 인스턴스에 대해 true를 돌려줍니다.
class X < String
end
foo = X.new
foo.is_a? String # true
foo.kind_of? String # true
foo.instance_of? String # false
foo.instance_of? X # true
답변
더 덕 타이핑 접근법은 다음과 같이 말할 것입니다.
foo.respond_to?(:to_str)
to_str
객체의 클래스가 String의 실제 자손이 아닐 수 있지만 객체 자체가 문자열과 매우 유사 함을 나타냅니다 (stringy?).
답변
넌 할 수있어:
foo.instance_of?(String)
그리고 더 일반적 :
foo.kind_of?(String)
답변
foo.instance_of? String
또는
foo.kind_of? String
String
상속 체인의 어딘가 에서 파생 된 경우에만 관심이 있다면
답변
다른 답변 외에도 Class는 객체가 해당 클래스의 인스턴스인지 테스트하기 위해 === 메서드를 정의합니다.
- o.class 오의 클래스입니다.
- o.instance_of? c 는 o.class == c 인지 여부를 결정합니다.
- o.is_a? c o는 c 의 인스턴스입니까, 아니면 하위 클래스입니까?
- o.kind_of? * is_a? *의 c 동의어
- c === o 클래스 또는 모듈의 경우 * o.is_a? c * ( String === “s” 는 true를 반환)
답변
더 좋은 방법은 술어 메서드를 만드는 것입니다. 이렇게하면 “단일 제어 지점”도 저장됩니다.
class Object
def is_string?
false
end
end
class String
def is_string?
true
end
end
print "test".is_string? #=> true
print 1.is_string? #=> false
더 많은 오리 타이핑 방법;)