给定一个这样的字符串对象:
twohundred = "200"
做什么之间有什么区别:
Integer(twohundred) #=> 200
和
twohundred.to_i #=> 200
有什么区别吗?是否建议在另一个中使用一个?
答案 0 :(得分:44)
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读取数字(可能前面带有减号),直到它读取空白字符或到达字符串的末尾。然后它只是将这些数字和可能的减号转换为它返回的Fixnum
。 to_i
肯定有其用途,但这些示例表明,如果您希望在字符串不包含整数表示时返回int1
,则应使用int2
或nil