将Ruby字符串转换为整数并设置默认值

6
有没有一个 Ruby 方法,它接受一个字符串和一个默认值,并将其转换为整数(如果字符串表示整数),否则返回默认值? 更新: 我认为以下答案更好:
class String
  def try_to_i(default = nil)
    /^\d+$/ === self ? to_i : default
  end
end

这里有证据说明为什么要避免异常:
> def time; t = Time.now; yield; Time.now - t end

> time { 1000000.times { |i| ('_' << i.to_s) =~ /\d+/ } }
=> 1.3491532 
> time { 1000000.times { |i| Integer.new('_' << i.to_s) rescue nil } }
=> 27.190596426 

“包含整数”是什么意思? - Niklas B.
"过早的优化是万恶之源" - 唐纳德·克努斯 - Reactormonk
3个回答

8

#to_iInteger()两种方法可以进行转化。第一种的默认值为0,而第二种则会引发一个ArgumentError异常。

class String
  def to_integer(default)
    Integer(self)
  rescue ArgumentError
    default
  end
end

我认为在正常情况下使用异常会带来太高的性能开销。 - Alexey
我必须承认这是更优雅的解决方案,应该被接受。我之前没有建议这个方法只是因为我不知道 Integer() 的存在。@Alexey:使用正则表达式会带来更多问题。 - Niklas B.

2

你需要自己编写代码,可能需要使用正则表达式来检查字符串:

def try_to_i(str, default = nil)
  str =~ /^-?\d+$/ ? str.to_i : default
end

-1
你可以像这样做:
int_value = (stringVar.match(/^(\d+)$/) && $1.to_i) || default_value

这将检查字符串是否完全由数字组成,如果是,则转换为int,否则返回默认值。


Ruby有?:,为什么要使用不可靠的&& ... || ...习惯用法呢? - Niklas B.
我认为,将整数情况捆绑到括号块中似乎在概念上更合理,而不是使用三目运算符。另外,&&/|| 怎么会不可靠呢?当然,如果您在其书面等价操作符(or/and)之间切换,那么存在优先级的问题,但一致使用可以消除这个问题。话虽如此,这取决于你——如果三目运算符适合你的风格,请使用它。 - Alex Westholm
我的意思是,你总是不得不仔细考虑 &&|| 之间的部分是否可能成为 falsenil,在这种情况下它与条件运算符或一个 if .. then .. else 不等价。但在这种情况下没关系,因为 to_i 总是返回整数值。顺便说一下,在你的例子中不需要括号。 - Niklas B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接