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

还有什么比下面这些更加地道的吗?

foo.class == String
158203 次浏览

你可以这样做:

foo.instance_of?(String)

更一般的说法是:

foo.kind_of?(String)
foo.instance_of? String

或者

foo.kind_of? String

如果你只关心它是否是从 String继承链上的某个地方派生出来的

我认为你正在寻找 instance_of?.is_a?kind_of?将返回真从派生类的实例。

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)

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

除了其他答案之外,Class 还定义了 method = = = 来测试一个对象是否是该类的实例。

  • O 类 O 类。
  • O.instance _ of? c 确定是否 < em > o.class = = c
  • O 是 c 的实例还是它的子类?
  • O.kind _ of? c * is _ a? * 的同义词
  • 对于类或模块,确定 * o.is _ a? c * (字符串 = = = “ 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

鸭子打字方式越多;)