Есть ли что-нибудь более идиоматичное, чем следующее?
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, но сам объект очень похож на строку (тягучий?).
fooбудет либо true, falseили строка ванили, но это хорошо , чтобы узнать более общие решения.
to_str, или to_s? Эти два немного отличаются.
Ты можешь сделать:
foo.instance_of?(String)
И более общее:
foo.kind_of?(String)
kind_ofболее общим? Они кажутся синонимами: is_a.
instance_of?вместо is_a?.
В дополнение к другим ответам Class определяет метод === для проверки того, является ли объект экземпляром этого класса.
Я думаю, что лучший способ - создать несколько методов предиката. Это также сохранит вашу «Единую точку контроля».
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?) Теперь требования к вашему проекту изменится, и каждая строка из трех или более символов больше не определяется как строка (я знаю, что это необычно;)) Теперь вы можете легко изменить свой собственный метод.
is_a?это более подходящая идиома для использования (и часто проверка типа «утка», как упоминает Эндрю Гримм, даже лучше). Строгое сравнение классов - это обычно запах кода. en.wikipedia.org/wiki/Liskov_substitution_principle