给定一个这样的字符串对象:
twohundred = "200"
做有什么区别:
Integer(twohundred) #=> 200
和:
twohundred.to_i #=> 200
有什么区别吗?是否建议使用其中之一?
给定一个这样的字符串对象:
twohundred = "200"
做有什么区别:
Integer(twohundred) #=> 200
和:
twohundred.to_i #=> 200
有什么区别吗?是否建议使用其中之一?
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
来自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
。
让我们来看看使用实例方法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
在字符串不包含整数表示的情况下返回。