1
2.0.0p247 :069 > str[str.length].class
=> NilClass 
2.0.0p247 :071 > str[str.length, 1].class
=> String 
2.0.0p247 :072 > str[str.length, 2].class
=> String 
2.0.0p247 :073 > str[str.length+ 1, 2].class
=> NilClass 

1 行目は を返しNilClass、2 行目は を返しますString。Ruby メソッドString#[n]は 1 文字の文字列をString#[m, n]返し、文字列から部分文字列を返します。それは、単一文字の文字列が部分文字列と異なるということですか?

4

2 に答える 2

3

それは、単一文字の文字列が部分文字列と異なるということですか?

いいえ。これは、String#[]渡された引数に応じて の動作が異なることを意味します。

文字列の最後の文字を超えてアクセスしようとしています。

str[str.length]

nilそこにキャラクターがいないので戻ります。

ドキュメントには次のように記載されています。

nil最初のインデックスが文字列の外にある場合、または長さが負の場合に返します。

str[-1]

最後の文字を返し、...

str[-1].class

戻りますString

同様に...

str[str.length, 1]

空の文字列を返します""

繰り返しますが、ドキュメントには次のように記載されています(強調は私のものです):

startインデックスとが渡された場合、インデックスで始まる文字を含む部分文字列length返します。length

の末尾を超える文字がないためstr、この部分文字列は空です。

于 2013-10-02T09:33:14.780 に答える
2

以下のコードに従ってください。

s = "abc"
s[s.size] # => nil
s[s.size,1] # => ""
s.size # => 3

のドキュメントString#[]:

Element Reference — (a) 単一のインデックスが渡された場合、そのインデックスにある 1 文字の部分文字列を返します。(b) 開始インデックスと長さが渡された場合、インデックスで始まる長さの文字を含む部分文字列を返します。

上記の両方に適用されます。インデックスが負の場合、文字列の末尾からカウントされます。start および range の場合、開始インデックスは文字の直前であり、文字列のサイズに一致するインデックスです。(c)さらに、文字範囲の開始インデックスが文字列の末尾にある場合、空の文字列が返されます。

(d) 最初のインデックスが文字列の外にある場合、または長さが負の場合は nil を返します

  • なぜs[s.size] # => 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
于 2013-10-02T09:27:12.410 に答える