superclass=Object
type=class
library=_builtin
extended=
included=Enumerable,Comparable

文字列のクラスです。
NUL 文字を含む任意のバイト列を扱うことができます。
文字列の長さにはメモリ容量以外の制限はありません。

文字列は通常、文字列リテラルを使って生成します。
以下に文字列リテラルの例をいくつか示します。

  'str\\ing'   # シングルクオート文字列 (エスケープシーケンスがほぼ無効)
  "string\n"   # ダブルクオート文字列 (エスケープシーケンスがすべて有効)
  %q(str\\ing) # 「%q」文字列 (エスケープシーケンスがほぼ無効、デリミタが変えられる)
  %Q(string\n) # 「%Q」文字列 (エスケープシーケンスがすべて有効、デリミタが変えられる)

  # ヒアドキュメント
  <<End
  この行はヒアドキュメント
  End

  # ダブルクオートヒアドキュメント (クオートなしの場合と同じ)
  <<"End"
  この行はヒアドキュメント
  End

  # シングルクオートヒアドキュメント (一切のエスケープシーケンスが無効)
  <<'End'
  この行はヒアドキュメント
  End

  # 終端記号がインデントされたヒアドキュメント
  # シングルクオート、ダブルクオートとの併用も可能
  <<-End
  この行はヒアドキュメント (終端記号をインデントできる)
     End

===[a:mutable] 破壊的な変更

Ruby の String クラスは mutable です。
つまり、オブジェクト自体を破壊的に変更できます。

「破壊的な変更」とは、あるオブジェクトの内容自体を変化させることです。
例えば文字列のすべての文字を破壊的に大文字へ変更する
[[m:String#upcase!]] メソッドの使用例を以下に示します。

  a = "string"
  b = a
  a.upcase!
  p a   # => "STRING"
  p b   # => "STRING"

この例では、a に対してメソッドを呼んだにも関わらず b も変更されています。
これは、変数 a と b が一つの文字列オブジェクトを指していて、
upcase! メソッドでそのオブジェクト自体が変更されたからです。

upcase! の非破壊版である [[m:String#upcase]] を使った例を以下に示します。
こちらでは a の変更が b に波及しません。

  a = "string"
  b = a
  a = a.upcase
  p a   # => "STRING"
  p b   # => "string"

一般には、破壊的「ではない」メソッドを
中心に使っていくほうがバグが出にくくなります。

String クラスのメソッドには破壊的なメソッドも非破壊的なメソッドもあります。
破壊的なメソッドの例としては concat, sub!, upcase! などが挙げられます。
非破壊的なメソッドの例としては index, sub, upcase などが挙げられます。

同じ動作で破壊的なメソッドと非破壊的なメソッドの両方が定義されているときは、
破壊的なバージョンには名前の最後に「!」が付いています。
例えば upcase メソッドは非破壊的で、upcase! メソッドは破壊的です。

ただし、この命名ルールを
「破壊的なメソッドにはすべて『!』が付いている」と解釈しないでください。
例えば concat には「!」が付いていませんが、破壊的です。あくまでも、
「『!』が付いているメソッドと付いていないメソッドの両方があるときは、
『!』が付いているほうが破壊的」というだけです。
「『!』が付いているならば破壊的」は常に成立しますが、逆は必ずしも成立しません。

===[a:multi] マルチバイト文字列の処理

String クラスは自身を文字の列ではなくバイト列として扱います。
例えば str[1] は str の内容やエンコーディングに関わらず
2 バイトめの数値を返します。

マルチバイト文字列を正しく処理するためには、
原則としてインデックスよりも正規表現を使うメソッド、
例えば [[m:String#sub]] や [[m:String#gsub]] を中心に用いるべきです。
Ruby の正規表現エンジンはマルチバイト文字列に対応しているので、
正規表現を使って位置を指定すればマルチバイト文字を正しく処理できます。
なお、正規表現を正しく動作させるためには、組み込み変数 [[m:$KCODE]]
を文字列のエンコーディングにあわせて設定する必要があります。

また、[[lib:jcode]] ライブラリを利用すると
String クラスのすべてのメソッドが文字単位で動作するようになります。
しかし jcode ライブラリはプロセス全体に影響するため、
中程度以上の規模プログラムで用いることは推奨できません。
