40

次のような文字列オブジェクトがあるとします。

twohundred = "200"

行うことの違いは何ですか:

Integer(twohundred)  #=> 200

と:

twohundred.to_i      #=> 200

違いはありますか?そのうちの1つを使用することをお勧めしますか?

4

3 に答える 3

59

Integer(num)ArgumentErrornum が有効な整数でない場合、例外がスローされます (基数を指定できます)。

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
于 2012-04-10T17:29:40.193 に答える
11

の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.

于 2012-04-10T17:32:02.453 に答える
3

インスタンス メソッドString#to_iとモジュール メソッドKernel::Integerの使用の違いを調べてみましょう。ただし、最初に、後者を別のメソッドに埋め込みましょうint1

def int1(str)
  Integer(str) rescue nil
end

そうすればstr、整数として解釈できない場合IntegerArgumentError例外が発生し、インライン レスキューが返されnilます。Integerexecption を発生させない場合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場合はを返します。それ以外の場合は、文字列に相当する整数を返します。strint2nilint

いくつか比較してみましょう。

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確かに用途がありますが、これらの例は、文字列に整数の表現が含まれていない場合にint1orint2を返す必要があることを示しています。nil

于 2016-06-12T19:36:34.500 に答える