Untersuchen wir die Unterschiede zwischen der Verwendung der Instanzmethode String#to_i und der Modulmethode Kernel::Integer. Zunächst aber wollen wir die später in einem anderen Verfahren einzubetten int1
:
def int1(str)
Integer(str) rescue nil
end
diese Weise, wenn str
nicht als ganze Zahl aufgefasst werden kann, Integer
wird eine ArgumentError
Ausnahme auslösen, wodurch die in-line Rettungs nil
zurückzukehren. Wenn Integer
keine execption erhöhen int
die ganze Zahl Äquivalent der Zeichenfolge zurück.
Um die Vergleiche abzurunden, fügen wir auch einen regulären Ausdruck hinzu, der bestätigt, dass der Inhalt des Strings eine Ganzzahl darstellt, bevor to_i
für die Konvertierung verwendet wird.
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
Wie bei int1
, wenn str
nicht als ganze Zahl angesehen werden, werden int2
nil
zurückzukehren; Andernfalls gibt int
das Ganzzahläquivalent der Zeichenfolge zurück.
Lassen Sie uns einige Vergleiche versuchen.
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 lesen Ziffern (möglicherweise durch ein Minuszeichen), bis er ein Leerzeichen oder erreicht das Ende der Zeichenfolge liest. Es konvertiert dann nur diese Ziffern und mögliche Minuszeichen in eine Fixnum
, die es zurückgibt. to_i
hat sicher seinen Nutzen, aber diese Beispiele zeigen, dass Sie int1
oder int2
verwenden sollten, wenn Sie es wünschen nil
zurück, wenn die Zeichenfolge nicht die Darstellung einer ganzen Zahl enthält.
Tolle Antwort. Vielen Dank. – Nobita
Beachten Sie, dass Sie die Basis für beide angeben können: ('Kernel # Integer') (http://ruby-doc.org/core-2.3.1/Kernel.html#method-i-Integer) und [' String # to_i'] (http://ruby-doc.org/core-2.3.1/String.html#method-i-to_i). – Stefan
Ein weiterer bemerkenswerter Fall ist '' 'nil.to_i # => 0''', während' '' Integer (nil) # => typeError: kann nil nicht in Integer''' – Levsero