以下のコードに従ってください。
s = "abc"
s[s.size] # => nil
s[s.size,1] # => ""
s.size # => 3
のドキュメントString#[]
:
Element Reference — (a) 単一のインデックスが渡された場合、そのインデックスにある 1 文字の部分文字列を返します。(b) 開始インデックスと長さが渡された場合、インデックスで始まる長さの文字を含む部分文字列を返します。
上記の両方に適用されます。インデックスが負の場合、文字列の末尾からカウントされます。start および range の場合、開始インデックスは文字の直前であり、文字列のサイズに一致するインデックスです。(c)さらに、文字範囲の開始インデックスが文字列の末尾にある場合、空の文字列が返されます。
(d) 最初のインデックスが文字列の外にある場合、または長さが負の場合は nil を返します
インデックス3
には文字がないため、 nil
.(適用ルール - anil
) を返します。ルール a は、存在する場合、または見つからない場合、指定されたインデックスから文字を返します。
- なぜ
s[s.size,1] # => ""
ですか?
これは直接rule-cに送られるためです。
- なぜ
s[s.size+1,1] # => nil
ですか?
rule-dがそのように言っているからです。
それnil
はのインスタンスでNilclass
あり、''
空の文字列は String クラスのインスタンスであると述べました。したがって、取得したものはすべて有効です..
s = "abc"
s[s.size].class # => NilClass
s[s.size,1].class # => String