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

在Ruby中检查变量是否为字符串,ruby,idioms,typechecking,Ruby,Idioms,Typechecking,还有什么比下面更地道的吗 foo.class == String 你可以做: foo.instance_of?(String) 更一般的是: foo.kind_of?(String) 或 如果你只关心它是不是从继承链上的某个地方派生出来的,我想你是在寻找?的实例是一种?和种类?将返回true class X < String end foo = X.new foo.is_a? String # true foo.kind_of? String # tru

还有什么比下面更地道的吗

foo.class == String
你可以做:

foo.instance_of?(String)
更一般的是:

foo.kind_of?(String)


如果你只关心它是不是从继承链上的某个地方派生出来的,我想你是在寻找?的实例<对于派生类的实例,code>是一种?和
种类?
将返回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
X类
一种更简单的键入方法是

foo.respond_to?(:to_str)

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

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

  • o.classo.class
  • o.instance\u of?c确定o.class==c
  • o.U是a吗?co是c的实例还是它的任何子类
  • 什么样的?c是*的同义词*
  • c===o对于类或模块,确定*o.a是否为?c*(字符串==“s”返回true)

    • 我认为更好的方法是创建一些谓词方法。 这也将节省您的“单点控制”


      更简单的输入方式;)

      是什么使
      这类
      更加通用?它们似乎是同义词:@Davidchambers你是对的,'kind_of?'是'is_a?'的同义词。@Davidchambers:你是对的,我的意思是
      instance\u of?
      而不是
      is_a?
      。酷。在这种情况下,我碰巧知道
      foo
      要么是
      true
      false
      ,要么是一个普通的字符串,但最好了解更多的通用解决方案。在检查对象是否响应它之后,将其与to调用结合起来,您就得到了一个字符串@seanmakesgames你是说
      到_str
      ,还是
      到_s
      ?两者略有不同。Re:andrew的评论。在不知道问题意图的情况下,我会说对于大多数现实编程情况,
      is_a?
      实际上是更适合使用的习惯用法(通常,andrew Grimm提到的duck类型检查更好)。严格的类比较通常是一种代码味道。快速旁白:如果在条件逻辑中使用此选项,则需要使用括号;例如,如果foo.is_a?(String)&&…如预期的那样,这种方法不仅适用于
      String
      ,而且适用于
      Integer
      Float
      。它是否也适用于十进制?(升华文本解释器以不同的方式突出显示了
      十进制
      的语法,这让我感到怀疑)
      的“string”有什么问题吗?(string)
      。看起来你在重新发明轮子。还有
      实例
      种类
      ,等等。。。对
      对象
      进行猴子补丁是个坏主意,更不用说它是不必要的。我完全同意你的观点:)如果你只关注基本类型,并且你知道与基本类型相关的项目需求永远不会改变(好的,通常是这样;))你就没事了。但在需求发生变化的情况下,最好有一个“单点控制”。例如,在您的项目环境中,您有很多预检查(1000次及以上)
      pre_check(“test”。is_string?
      现在,您的项目需求将发生变化,并且每个包含三个字符或更多字符的字符串不再定义为字符串(我知道它不寻常),现在您可以轻松地更改自己的方法。
      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.respond_to?(:to_str)
      
      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