次のような文字列オブジェクトがあるとします。
twohundred = "200"
行うことの違いは何ですか:
Integer(twohundred) #=> 200
と:
twohundred.to_i #=> 200
違いはありますか?そのうちの1つを使用することをお勧めしますか?
次のような文字列オブジェクトがあるとします。
twohundred = "200"
行うことの違いは何ですか:
Integer(twohundred) #=> 200
と:
twohundred.to_i #=> 200
違いはありますか?そのうちの1つを使用することをお勧めしますか?
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 が String の場合、base が省略されるかゼロに等しい場合、基数インジケータ (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
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
orint2
を返す必要があることを示しています。nil