40

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

twohundred = "200"

做有什么区别:

Integer(twohundred)  #=> 200

和:

twohundred.to_i      #=> 200

有什么区别吗?是否建议使用其中之一?

4

3 回答 3

59

Integer(num)ArgumentError如果 num 不是有效的整数(您可以指定基数),将引发异常。

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
于 2012-04-10T17:29:40.193 回答
11

来自Ruby文档Integer()

Integer(arg,base=0) → integer ... 如果 arg 是一个字符串,当 base 被省略或等于 0 时,基数指示符(0、0b 和 0x)被接受。在任何情况下,字符串都应该严格遵守数字表示。此行为与 String#to_i 的行为不同。

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

另一个例子:Integer("0010") => 8"0010".to_i => 10

于 2012-04-10T17:32:02.453 回答
3

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

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

这样,如果str不能被解释为整数,Integer将引发ArgumentError异常,导致内联救援返回nil。如果Integer不引发 execptionint将返回字符串的等效整数。

为了完成比较,让我们还添加一个正则表达式,在使用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读取数字(可能前面有一个减号),直到它读取一个空白字符或到达字符串的末尾。然后它只是将这些数字和可能的减号转换为 a Fixnum,然后返回。to_i当然有它的用途,但是这些例子表明你应该使用int1或者int2如果你希望nil在字符串不包含整数表示的情况下返回。

于 2016-06-12T19:36:34.500 回答