Відповіді:
Я думаю, ти шукаєш 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?) Тепер ваша вимога проекту зміниться, і кожен рядок з трьома символами або більше більше не визначається як String (я знаю його незвичайність;)) Тепер ви можете легко змінити власний метод.
is_a?насправді є більш прийнятною ідіомою (і часто перевірка набору качок, як згадує Ендрю Грімм, ще краща). Суворе порівняння класів зазвичай кодовий запах. en.wikipedia.org/wiki/Liskov_substitution_principle