다음보다 더 관용적 인 것이 있습니까?
foo.class == String
다음보다 더 관용적 인 것이 있습니까?
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
String
에서뿐만 아니라 Integer
및 에서도 작동 Float
합니다. 그것은 또한 작동합니까 Decimal
? (숭고한 텍스트 인터프리터는 구문을 다르게 강조하여 Decimal
나를 의심하게 만듭니다)
더 덕 타이핑 접근법은 다음과 같이 말할 것입니다.
foo.respond_to?(:to_str)
to_str
객체의 클래스가 String의 실제 자손이 아닐 수 있지만 객체 자체가 문자열과 매우 유사 함을 나타냅니다 (stringy?).
foo
이 될 것입니다 true
, false
또는 바닐라 문자열 만의 좋은 일반적인 솔루션을 배울 수 있습니다.
to_str
또는을 ( 를) 의미 했습니까 to_s
? 둘은 약간 다릅니다.
넌 할 수있어:
foo.instance_of?(String)
그리고 더 일반적 :
foo.kind_of?(String)
kind_of
더 일반적입니까? 동의어로 보입니다 : is_a
.
instance_of?
대신 is_a?
.
더 좋은 방법은 술어 메서드를 만드는 것입니다. 이렇게하면 "단일 제어 지점"도 저장됩니다.
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
더 많은 오리 타이핑 방법;)
"string".is_a?(String)
. 바퀴를 재창조하는 것 같습니다. 도 있습니다 class
, instance_of
, kind_of
, 원숭이 패치 등 ... 나쁜 아이디어는 Object
클래스, 그것은 불필요한이야 말할 것도없고.
pre_check("test".is_string?)
이제 프로젝트 요구 사항이 변경되고 3 자 이상의 모든 문자열이 더 이상 문자열로 정의되지 않습니다 (비정상적인 것을 알고 있습니다.)) 이제 자신의 방법을 쉽게 변경할 수 있습니다.
is_a?
실제로 사용하기에 더 적합한 관용구 라고 말하고 싶습니다 (그리고 Andrew Grimm이 언급 한 것과 같은 오리 타이핑 검사가 더 낫습니다). 엄격한 클래스 비교는 일반적으로 코드 냄새입니다. en.wikipedia.org/wiki/Liskov_substitution_principle