Відповіді:
Я думаю, ти шукаєш 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