2011-10-13 1 views

답변

149

나는 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 
+6

질문의 의도를 모른 채, 대부분의 실제 프로그래밍 상황에서 'is_a?'는 실제로 사용하기에 더 적합한 관용구입니다. 앤드류 그림과 같은 오리 유형 검사는 더 좋습니다. 엄격한 클래스 비교는 대개 코드 냄새입니다. http : //en.wikipedia.org/wiki/Liskov_substitution_principle – mahemoff

16

당신은 할 수 있습니다 :

foo.instance_of?(String) 

그리고 더 일반적인를 :

foo.kind_of?(String) 
+3

만든다'더 일반적인 무엇 kind_of'? 그들은 동의어 인 것처럼 보입니다 : ['is_a'] (http://ruby-doc.org/docs/ProgrammingRuby/html/ref_c_object.html#Object.is_a_qm). – davidchambers

+2

@Davidchambers 당신 말이 맞아요, 'kind_of?' 'is_a?'와 동의어입니다. – steenslag

+0

@ davidchambers : 네가 맞아, is_a 대신에 instance_of?를 의미했다. –

6
foo.instance_of? String 

또는

foo.kind_of? String 

만약 당신이 당신 오어딘가 상속 체인에서 파생 된 경우 신경을 써야합니다.

24

더 오리 타이핑 접근 방식은

foo.respond_to?(:to_str) 

to_str

객체의 클래스가 문자열의 실제 후손하지 않을 수 있음을 나타냅니다 말을하는 것입니다,하지만 개체 자체는 문자열처럼 매우 많이 (스트링?).

+0

차가움. 이 경우 나는'foo'가'true','false' 또는 바닐라 문자열 중 하나라는 것을 알게됩니다. 그러나 좀 더 일반적인 해결책을 배우는 것이 좋습니다. – davidchambers

+0

이 객체가 응답하는지 검사 한 후 this를 to_s 호출과 결합하면 자신이 문자열이됩니다! – seanmakesgames

+1

@seanmakesgames'to_str' 또는'to_s'을 (를) 사용 했습니까? 두 개는 약간 다릅니다. –

2

Class는 다른 대답 이외에도 개체가 해당 클래스의 인스턴스인지 여부를 테스트하는 메서드를 정의합니다.

  • o.class o.
  • o.instance_of? c은 다음을 결정합니다. o.class == c
  • o.is_a? c o는 c 또는 그 하위 클래스 중 하나의 인스턴스입니까?
  • o.kind_of? c * is_a와 동의어 *
  • 클래스 또는 모듈에 대해 c === o, * o.is_a? ㄴ * (참 문자열 === "의" 반환)
0

더 좋은 방법은 몇 가지 조건 방법을 만드는 것입니다 생각합니다. "Single Point of Control"도 저장됩니다.

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 

더 많은 오리 타이핑 방법

는)

+1

''string '.is_a? (String)'에 무슨 문제가 있습니까? 당신이 바퀴를 재발 명하고있는 것처럼 보입니다. 'class','instance_of','kind_of' 등도 있습니다. 원숭이에게'Object' 클래스를 패치하는 것은 좋지 않습니다. – Mohamad

+0

전적으로 당신과 동의합니다 :) 오직 primitve 타입에만 집중하고 원시 타입과 관련된 프로젝트 요구 사항이 결코 바뀌지 않을 것이라는 것을 알고 있다면 (보통 대소 문자를 구해야합니다.)) 괜찮습니다. 그러나 요구 사항이 "Single Point of Control"을 갖는 것이 더 나은 경우가 있습니다. 예를 들어, 프로젝트 환경에서 많은 사전 점검 (1000 개 이상)이 있습니다. 'pre_check ("test".is_string?)' 이제 프로젝트 요구 사항이 바뀌고 3 자 이상의 모든 문자열은 더 이상 String으로 정의되지 않습니다. (나는 이상하게 여깁니다.) 이제 자신 만의 방법을 쉽게 변경할 수 있습니다. – schlegel11