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

时间:2012-04-10 17:26:44

标签: ruby

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

twohundred = "200"

做什么之间有什么区别:

Integer(twohundred)  #=> 200

twohundred.to_i      #=> 200

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

3 个答案:

答案 0 :(得分:44)

如果num不是有效整数,则

Integer(num)将抛出ArgumentError异常(您可以指定基数)。

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

答案 1 :(得分:9)

来自Integer()的Ruby documentation

  

整数(arg,base = 0)→整数   ...   如果arg是一个String,当省略base或等于零时,radix   指标(0,0b和0x)受到尊重。在任何情况下,字符串应该是   严格遵守数字表示。这种行为是   不同于String#to_i。

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

答案 2 :(得分:2)

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

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

这样,如果str不能被解释为整数,Integer将引发ArgumentError异常,导致内联救援返回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肯定有其用途,但这些示例表明,如果您希望在字符串不包含整数表示时返回int1,则应使用int2nil