【问题标题】:Ruby is_a?(Integer) issues [duplicate]Ruby is_a?(整数)问题[重复]
【发布时间】:2013-09-06 13:01:06
【问题描述】:

我正在尝试测试我的变量是否为整数,这是代码:

if (params[:int1].is_a?(Integer) && params[:int2].is_a?(Integer))
  add(params[:int1], params[:int2])
else
  puts "Need two integers"
end

如果你知道它为什么不起作用,你就会引起我的注意。

【问题讨论】:

  • 定义“不起作用”
  • is_a? 检查确切的类型,并且不在字符串和整数类型之间执行任何强制转换。我的猜测是你的参数是字符串。尝试使用正则表达式检查它们是否为数字或构造整数并捕获参数错误。
  • params[] 要么是字符串,要么是 nil。 params[].is_a?(Integer) 永远不会是真的。

标签: ruby


【解决方案1】:
params= { int1: "1" }

puts params[:int1].class

> String

您的参数哈希可能包含字符串值而不是整数。如果你想检查一个字符串是否是一个有效的整数,你可以尝试用一个正则表达式来验证它,如下所示:

if /\d+/=~ params[:int1]
  # do stuff
end

【讨论】:

  • 因为如果它真的是一个整数:42.is_a?(Integer) #=> true
  • 我尝试了您的解决方案(如果 /\d+/=~ params[:int1]),但我现在有一个内部服务器错误:/
  • 我的错,它有效,非常感谢!
【解决方案2】:

params[] 只存储字符串。您需要将它们转换为整数。

尝试类似:

params[:int1].empty? ? raise EmptyIntegerException : my_int1 = params[:int1].to_i

【讨论】:

  • (假设我们正在谈论的是 Rails;哈希值通常可以是任何东西。我也会使用present? 将非异常代码移近测试。)
  • 你是对的。但可能我会选择像my_int1 = params[:int1].to_i if params[:int1].present? 这样的东西而不是三元。
猜你喜欢
  • 2014-04-04
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2019-02-17
  • 2011-05-16
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多