ChatGPT解决这个技术问题 Extra ChatGPT

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

还有什么比以下更惯用的吗?

foo.class == String

C
Candide

我认为您正在寻找 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

在不知道问题的意图的情况下,我会说对于大多数现实世界的编程情况,is_a? 实际上是更合适的习惯用法(通常像 Andrew Grimm 提到的鸭式检查甚至更好)。严格的类比较通常是代码异味。 en.wikipedia.org/wiki/Liskov_substitution_principle
顺便说一句:如果你在条件逻辑中使用它,你需要使用括号;例如,如果 foo.is_a?(String) && ...
正如预期的那样,这种方法不仅适用于 String,而且适用于 IntegerFloat。它也适用于 Decimal 吗? (崇高的文本解释器以不同的方式突出显示 Decimal 的语法,这让我很怀疑)
A
Andrew Grimm

一个更鸭式的方法是说

foo.respond_to?(:to_str)

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


凉爽的。在这种情况下,我碰巧知道 foo 将是 truefalse 或普通字符串,但学习更多通用解决方案是件好事。
在检查对象是否响应它之后,将它与 to_s 调用结合起来,你就得到了一个字符串!
@seanmakesgames 你是说to_str还是to_s?两者略有不同。
stackoverflow.com/questions/11182052/… 回复:安德鲁的评论。
M
Milo P

你可以做:

foo.instance_of?(String)

更一般的:

foo.kind_of?(String)

是什么让 kind_of 更通用?它们似乎是同义词:is_a
@Davidchambers 你是对的,'kind_of?'是 'is_a?' 的同义词。
@davidchambers:你说得对,我的意思是 instance_of? 而不是 is_a?
M
Matthew
foo.instance_of? String

或者

foo.kind_of? String 

如果您只关心它是否从 String 派生自其继承链的某个位置


s
steenslag

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

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" 返回真)


s
schlegel11

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

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

更多的鸭子打字方式;)


"string".is_a?(String) 有什么问题。看起来你正在重新发明轮子。还有 classinstance_ofkind_of 等... 猴子修补 Object 类是个坏主意,更不用说它是不必要的了。
我完全同意你的看法 :) 如果你只关注原始类型,并且你知道与原始类型相关的项目需求永远不会改变(通常情况下是这样;))你很好。但是在需求发生变化的情况下,最好有一个“单点控制”。例如,在您的项目环境中,您有很多预检查(1000 及以上)。 pre_check("test".is_string?) 现在您的项目需求将发生变化,每个包含三个或更多字符的字符串不再定义为字符串(我知道它不寻常;))现在您可以轻松更改自己的方法。