Проверьте, является ли переменная строкой в ​​Ruby - PullRequest
106 голосов
/ 13 октября 2011

Есть ли что-нибудь более идиоматическое, чем следующее?

foo.class == String

Ответы [ 6 ]

172 голосов
/ 13 октября 2011

Я думаю, что вы ищете 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
24 голосов
/ 13 октября 2011

Более утонченный подход - сказать

foo.respond_to?(:to_str)

to_str указывает, что класс объекта не может быть фактическим потомком String, но сам объект очень похож на строку (stringy?).

20 голосов
/ 13 октября 2011

Можно сделать:

foo.instance_of?(String)

И более общее:

foo.kind_of?(String)
6 голосов
/ 13 октября 2011
foo.instance_of? String

или

foo.kind_of? String 

если вас волнует только то, что оно получено из String где-то в цепочке наследования

3 голосов
/ 13 октября 2011

В дополнение к другим ответам, Class определяет метод ===, чтобы проверить, является ли объект экземпляром этого класса.

  • o.class class of 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)
0 голосов
/ 23 апреля 2015

Я думаю, что лучший способ - это создать несколько методов предикатов. Это также сохранит вашу «Единую точку контроля».

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

Чем больше утка набирает текст;)

...