Ruby에서 변수가 문자열인지 확인


답변:


205

나는 당신이 찾고 있다고 생각합니다 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

9
질문의 의도를 모르면 대부분의 실제 프로그래밍 상황에서 is_a?실제로 사용하기에 더 적합한 관용구 라고 말하고 싶습니다 (그리고 Andrew Grimm이 언급 한 것과 같은 오리 타이핑 검사가 더 낫습니다). 엄격한 클래스 비교는 일반적으로 코드 냄새입니다. en.wikipedia.org/wiki/Liskov_substitution_principle
mahemoff

참고 : 조건부 논리에서 이것을 사용한다면 괄호를 사용해야합니다. 예 : if foo.is_a? (String) && ...
dan

예상대로이 접근 방식은 String에서뿐만 아니라 Integer및 에서도 작동 Float합니다. 그것은 또한 작동합니까 Decimal? (숭고한 텍스트 인터프리터는 구문을 다르게 강조하여 Decimal나를 의심하게 만듭니다)
stevec

29

더 덕 타이핑 접근법은 다음과 같이 말할 것입니다.

foo.respond_to?(:to_str)

to_str 객체의 클래스가 String의 실제 자손이 아닐 수 있지만 객체 자체가 문자열과 매우 유사 함을 나타냅니다 (stringy?).


멋있는. 이 경우 나는 알고 일 foo이 될 것입니다 true, false또는 바닐라 문자열 만의 좋은 일반적인 솔루션을 배울 수 있습니다.
davidchambers

객체가 응답하는지 확인한 후 to_s 호출과 결합하면 문자열이 생성됩니다!
seanmakesgames jul.

1
@seanmakesgames to_str또는을 ( 를) 의미 했습니까 to_s? 둘은 약간 다릅니다.
Andrew Grimm


23

넌 할 수있어:

foo.instance_of?(String)

그리고 더 일반적 :

foo.kind_of?(String)

4
무엇이 kind_of더 일반적입니까? 동의어로 보입니다 : is_a.
davidchambers

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

@davidchambers : 당신이 바로, 내가 의미하고 instance_of?대신 is_a?.
Federico Builes 2011 년

7
foo.instance_of? String

또는

foo.kind_of? String 

String상속 체인의 어딘가 에서 파생 된 경우에만 관심이 있다면


4

다른 답변 외에도 Class는 객체가 해당 클래스의 인스턴스인지 테스트하기 위해 === 메서드를 정의합니다.

  • o.class 오의 클래스입니다.
  • o.instance_of? co.class == c 인지 여부를 결정합니다.
  • o.is_a? c o는 c 의 인스턴스입니까, 아니면 하위 클래스입니까?
  • o.kind_of? * is_a? *의 c 동의어
  • c === o 클래스 또는 모듈의 경우 * o.is_a? c * ( String === "s" 는 true를 반환)

-1

더 좋은 방법은 술어 메서드를 만드는 것입니다. 이렇게하면 "단일 제어 지점"도 저장됩니다.

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

더 많은 오리 타이핑 방법;)


2
에 무엇이 잘못되었는지 "string".is_a?(String). 바퀴를 재창조하는 것 같습니다. 도 있습니다 class, instance_of, kind_of, 원숭이 패치 등 ... 나쁜 아이디어는 Object클래스, 그것은 불필요한이야 말할 것도없고.
Mohamad

나는 당신과 전적으로 동의합니다 :) 당신의 초점이 primitve 유형에만 있고 원시 유형과 관련된 프로젝트 요구 사항이 결코 변경되지 않는다는 것을 알고 있다면 (일반적으로 그렇습니다.)) 괜찮습니다. 그러나 요구 사항이 변경되는 경우 "단일 제어 지점"을 갖는 것이 좋습니다. 예를 들어 프로젝트 환경에서 많은 사전 검사 (1000 이상)가 있습니다. pre_check("test".is_string?) 이제 프로젝트 요구 사항이 변경되고 3 자 이상의 모든 문자열이 더 이상 문자열로 정의되지 않습니다 (비정상적인 것을 알고 있습니다.)) 이제 자신의 방법을 쉽게 변경할 수 있습니다.
schlegel11 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.