Integer(value)和value.to_i之间的差异

给定一个像这样的字符串对象:

twohundred = "200" 

做的有什么区别:

 Integer(twohundred) #=> 200 

和:

 twohundred.to_i #=> 200 

有什么区别吗? 是否建议在另一个中使用一个?

如果num不是有效整数,则Integer(num)将抛出ArgumentErrorexception(您可以指定基数)。

num.to_i将尽可能多地进行转换。

例如:

 "2hi".to_i #=> 2 Integer("2hi") #=> throws ArgumentError "hi".to_i #=> 0 Integer("hi") #=> throws ArgumentError "2.0".to_i #=> 2 Integer("2.0") #=> throws ArgumentError 

Integer()的Ruby 文档 :

整数(arg,base = 0)→整数…如果arg是一个String,当省略base或等于零时,将遵循基数指示符(0,0b和0x)。 在任何情况下,字符串应严格遵守数字表示。 此行为与String#to_i的行为不同。

换句话说, Integer("0x100") => 256"0x100".to_i => 0

让我们来看一下使用实例方法String#to_i和模块方法Kernel :: Integer之间的区别。 首先,让我们将后者嵌入到另一个方法int1

 def int1(str) Integer(str) rescue nil end 

这样,如果str不能被解释为整数, Integer将引发ArgumentErrorexception,导致内联救援返回nil 。 如果Integer没有引发execption int将返回字符串的整数等价物。

为了完善比较,我们还添加一个正则表达式,在使用to_i进行转换之前,确认字符串的内容表示整数。

 R = / (?<=\A|\s) # match beginning of string or whitespace character (positive lookbehind) -? # optionally match a minus sign \d+ # match one or more digits (?=\s|\z) # match whitespace character or end of string (positive lookahead) /x # free spacing regex definition mode def int2(str) str =~ R ? str.to_i : nil end 

int1 ,如果str不能被解释为整数,则int2将返回nil ; 否则, int返回字符串的等效整数。

让我们尝试一些比较。

 str = '3' str.to_i #=> 3 int1(str) #=> 3 int2(str) #=> 3 str = '-3' str.to_i #=> -3 int1(str) #=> -3 int2(str) #=> -3 str = '3.0' str.to_i #=> 3 int1(str) #=> nil int2(str) #=> nil str = '3.2' str.to_i #=> 3 int1(str) #=> nil int2(str) #=> nil 1e3 #=> 1000.0 str = '1e3' str.to_i #=> 1 int1(str) #=> nil int2(str) #=> nil 

 str = '-1e3' str.to_i #=> -1 int1(str) #=> nil int2(str) #=> nil str = '- 1e3' str.to_i #=> 0 int1(str) #=> nil int2(str) #=> nil str = '3a' str.to_i #=> 3 int1(str) #=> nil int2(str) #=> nil str = '1-3a' str.to_i #=> 1 int1(str) #=> nil int2(str) #=> nil str = 'b3' str.to_i #=> 0 int1(str) #=> nil int2(str) #=> nil 

String#to_i读取数字(可能前面带有减号),直到它读取空白字符或到达字符串的末尾。 然后它只是将那些数字和可能的减号转换为它返回的Fixnumto_i肯定有它的用途,但是这些例子显示如果你希望在字符串不包含整数表示的情况下返回nil ,你应该使用int1int2