将Ruby字符串转换为具有默认值的整数

将Ruby字符串转换为具有默认值的整数,ruby,integer,type-conversion,Ruby,Integer,Type Conversion,是否有一个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.ti

是否有一个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 
>定义时间;t=时间。现在;产量Time.now-t结束
>时间{1000000.times{i|(''1.3491532
>时间{1000000.times{i|Integer.new(''27.190596426

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

def try_to_i(str, default = nil)
  str =~ /^-?\d+$/ ? str.to_i : default
end
#to_i
Integer()
要转换。第一个默认值为 0,第二个将引发ArgumentError

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

你可以这样做:

int_value = (stringVar.match(/^(\d+)$/) && $1.to_i) || default_value

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

您所说的“包含整数”是什么意思?
“过早优化是万恶之源”
-Donald KnuthRuby有
?:
,那么为什么要使用不可靠的
&&&&&&&&|&&&&|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&等价运算符(或/和),但一致的使用消除了这一点。尽管如此,这取决于你-如果三元组适合你的风格,那就去做吧。我的意思是,如果
&
|
之间的部分可以变成
false
nil
,你必须三思而后行,在这种情况下,它不等同于条件运算符或
if。。然后..else
。在这种情况下,这没关系,因为
to_i
总是返回一个整数值。顺便说一句,在您的示例中不需要括号。我认为在正常用例中使用异常会导致太高的性能开销。我必须同意这是一个更优雅的解决方案,应该被接受。我只是没有建议这样做,因为我不知道
Integer()
@Alexey:在作业中使用正则表达式的开销问题更大。