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