在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