Есть ли что-нибудь более идиоматичное, чем следующее?
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