检查变量是否为Ruby中的字符串


Answers:


205

我想你在找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

9
我不知道这个问题的意图,对于大多数现实世界中的编程情况,is_a?实际上是更适合使用的习惯用法(通常,像Andrew Grimm提到的那种鸭嘴式检查甚至更好)。严格的类比较通常是代码味道。en.wikipedia.org/wiki/Liskov_substitution_principle
mahemoff

简而言之:如果您在条件逻辑中使用此功能,则需要使用括号;例如,如果foo.is_a(字符串)&& ...?

如预期的那样,此方法不仅适用于和String,而且适用于IntegerFloat。它也适用Decimal吗?(崇高的文本解释器以不同的方式突出显示了语法,Decimal这使我感到怀疑)
stevec

29

一种更鸭蛋的方法是说

foo.respond_to?(:to_str)

to_str 指示对象的类可能不是String的实际后代,但对象本身非常像字符串(stringy?)。


凉。在这种情况下,我碰巧知道,foo要么是truefalse或香草字符串,但它是很好的学习更广泛的解决方案。
davidchambers,

在检查对象是否响应它之后,将此方法与to_s调用结合起来,您便得到了一个字符串!
seanmakesgames

1
@seanmakesgames您是说to_str还是to_s?两者略有不同。
Andrew Grimm



7
foo.instance_of? String

要么

foo.kind_of? String 

如果您只在乎它是否来自String其继承链的某个地方


4

除其他答案外,Class定义方法===来测试对象是否是该类的实例。

  • o.class类邻。
  • o.instance_of?C确定o.class == c
  • o.is_a?c是c或其任何子类的实例吗?
  • o.kind_of?* is_a?*的c同义词
  • c === o对于类或模块,确定* o.is_a?c *(字符串===“ s”返回true)

-1

我认为更好的方法是创建一些谓词方法。这还将保存您的“单一控制点”。

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

更多的鸭子打字方式;)


2
有什么问题"string".is_a?(String)。似乎您正在重新发明轮子。还有classinstance_ofkind_of,等...猴子修补坏主意的Object类,更何况这是不必要的。
Mohamad 2015年

我完全同意您的意见:)如果您只关注原始类型,并且您知道与原始类型相关的项目需求永远不会改变(通常是这样;))您可以。但是在需求改变的情况下,最好有一个“单一控制点”。例如,在您的项目环境中,您需要进行许多预检查(1000次及以上)。 pre_check("test".is_string?) 现在您的项目需求将发生变化,并且三个或三个以上字符的每个String都不再定义为String(我知道这很不寻常;)。现在,您可以轻松更改自己的方法。
schlegel11年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.