Проверьте, является ли переменная строкой в Ruby
Есть ли что-то более идиоматическое, чем следующее?
foo.class == String
6 ответов
Решение
Я думаю, что вы ищете 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
Ты можешь сделать:
foo.instance_of?(String)
И тем более общее:
foo.kind_of?(String)
Более утонченный подход - сказать
foo.respond_to?(:to_str)
to_str
указывает, что класс объекта не может быть фактическим потомком String, но сам объект очень похож на строку (stringy?).
foo.instance_of? String
или же
foo.kind_of? String
если вы вам все равно, если он извлечен из String
где-то вверх по цепочке наследования
В дополнение к другим ответам, Class определяет метод ===, чтобы проверить, является ли объект экземпляром этого класса.
- класс o.class
- o.instance_of? c определяет, будет ли o.class == c
- o.is_a? c Является ли экземпляр c или его подклассами?
- o.kind_of? c синонимом для * is_a? *
- c === o для класса или модуля, определите, есть ли * o.is_a? c * (String === "s" возвращает true)
Я думаю, что лучший способ - это создать некоторые методы предикатов. Это также сохранит вашу "Единую точку контроля".
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
Чем больше утка набирает путь;)