ruby 1.9.2 有 is_a 吗?功能?

Posted

技术标签:

【中文标题】ruby 1.9.2 有 is_a 吗?功能?【英文标题】:Does ruby 1.9.2 have an is_a? function? 【发布时间】:2011-05-16 00:00:00 【问题描述】:

我在 Google 上搜索到有一个 is_a? 函数可以检查对象是否为整数。

但是我在rails控制台试过了,还是不行。

我运行如下代码:

 "1".is_a?
 1.is_a?

我错过了什么吗?

【问题讨论】:

Google 不错,但它并不是寻找 Ruby 标准库和核心库中内容的第一个地方。我建议转到主要来源:您自己机器的ri,或rubydoc site。在您的命令行输入ri is_a? 可能会返回几个点击,其中重要的是Object.is_a? 你想要做什么的相关问题:Retrieve number from the string pattern using regular expression 【参考方案1】:

我想要类似的东西,但这些都没有为我做,但这个可以 - 使用“类”:

a = 11
a.class
=> Fixnum

【讨论】:

【参考方案2】:

没有内置函数可以判断字符串是否有效地是整数,但您可以轻松地制作自己的:

class String
  def int
    Integer(self) rescue nil
  end
end

这是可行的,因为如果字符串无法转换为整数,内核方法 Integer() 会引发错误,而内联 rescue nil 会将该错误变为 nil。

Integer("1") -> 1
Integer("1x") -> nil
Integer("x") -> nil

因此:

"1".int -> 1 (which in boolean terms is `true`)
"1x".int -> nil
"x".int -> nil

您可以更改函数以在真实情况下返回true,而不是整数本身,但是如果您正在测试字符串以查看它是否为整数,那么您很可能想要使用该整数来做一些事情!我经常做这样的事情:

if i = str.int
  # do stuff with the integer i
else
  # error handling for non-integer strings
end

虽然如果测试职位的作业冒犯了你,你总是可以这样做:

i = str.int
if i
  # do stuff with the integer i
else
  # error handling for non-integer strings
end

无论哪种方式,这种方法都只进行一次转换,如果你必须做很多,这可能是一个显着的速度优势。

[将函数名称从 int? 更改为 int 以避免暗示它应该只返回真/假。]

【讨论】:

为了清楚起见,直到我发布此内容后我才看到您的编辑,而且不是我对您投了反对票。 -1 因为这与问题无关,因为这是一个可怕的想法。 ?方法应该返回一个布尔值。 1 不等于 true。 与问题完全相关,正如海报在回应 Andrew Grimm 时澄清的那样。下次写之前先读一整页。 mlzboy,如果您更喜欢使用 ?只返回严格的布尔值。或者你喜欢的任何其他名字。 (这是他的方法,我只是教他怎么做。) 我把它改成了int? 真的不是重要的部分。【参考方案3】:

也许这会对你有所帮助

str = "1"
=> "1"
num = str.to_i
=> 1
num.is_a?(Integer)
=> true

str1 = 'Hello'
=> "Hello"
num1 = str1.to_i
=> 0
num1.is_a?(Integer)
=> true

【讨论】:

"1"'hello' 都以 true 结尾。你是故意的吗? @Andrew 我知道这两个结果都是真的。但我认为如果将字符串转换为整数,如“Hello”,我们会得到 0 作为值。所以这可能是区别点。 来自 String#to_i 文档:如果 str 开头没有有效数字,则返回 0。【参考方案4】:

我用了一个正则表达式

if a =~ /\d+/
   puts "y"
else
   p 'w'
end

【讨论】:

【参考方案5】:

您忘记包含您正在测试的类:

"1".is_a?(Integer) # false
1.is_a?(Integer) # true

【讨论】:

谢谢,其实我的情况是我想检查一个字符串是不是一个数字,如果 "1".is_a?(Ingeger) 返回 false,这似乎对这种情况没有用 @mlzboy:据我所知,Ruby 将"1" 视为一个字符串,而不是一个潜在的整数。你必须做2 + "2".to_i2 + Integer(2) - 你不能做2 + "2"。您可能想阅读Is ruby strongly or weakly typed ?【参考方案6】:

Ruby 有一个名为 respond_to 的函数?这可用于查看特定类或对象是否具有具有特定名称的方法。语法类似于

User.respond_to?('name') # returns true is method name exists
otherwise false

http://www.prateekdayal.net/2007/10/16/rubys-responds_to-for-checking-if-a-method-exists/

【讨论】:

respond_to?is_a? 非常不同。 @Greg: is_a? 看课,而respond_to? 对鸭子打字很有用。 +1:在 Ruby 中,最好检查对象是否按照您希望的方式执行,而不是某个类的实例。 Ruby 更多地依赖于“鸭子类型”而不是严格的继承。

以上是关于ruby 1.9.2 有 is_a 吗?功能?的主要内容,如果未能解决你的问题,请参考以下文章

在Ruby中递归地表示键

我可以通过 ruby​​ 驱动程序访问 mongo 的 geoNear 功能吗?

gitlab 9.0对ruby的版本有要求吗

Ruby 继承和类型

RUBY:递归符号键

ruby 运算符重载问题