Integer(value)和value.to_i之间的差异
给定一个像这样的字符串对象:
twohundred = "200"
做的有什么区别:
Integer(twohundred) #=> 200
和:
twohundred.to_i #=> 200
有什么区别吗? 是否建议在另一个中使用一个?
如果num不是有效整数,则Integer(num)
将抛出ArgumentError
exception(您可以指定基数)。
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
将引发ArgumentError
exception,导致内联救援返回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
肯定有它的用途,但是这些例子显示如果你希望在字符串不包含整数表示的情况下返回nil
,你应该使用int1
或int2
。