(本ページの準備として)
大別すると図のような(Ⅰ~Ⅲの)3つの考え方で実現することができる。
元の文字列(のメモリ領域上)で、対象な位置にある(先端、後端からの距離が同じ)
文字同士を入換える。
補足)
# Ⅰのプログラム例
n=s.length ; (0...n/2).each do |i| s[i],s[n-1-i]=s[n-1-i],s[i] end ; s
元の文字列(s とする)とは別に、結果の文字列(r
とする)を別途用意しておいて、
s から r (の対象関係の位置)に、順次文字を転送する。
# Ⅱのプログラム例
n=s.length ; r=" "*n ; for i in 0...n do r[i]=s[n-i-1] end ; r
結果の文字列となるスペースは、で確保する
s から(先頭から順に)一文字ずつ抜き出し、r の先頭側に順次押し込んで行く。
(以下のコードは、今の段階では理解困難でも構わない。 ゆっくり動作を追いかけてみて下さい)
# Ⅲのプログラム例
r="" ; s.each_char do |c| r[0,0]=c end ; r
上のプログラムはそれぞれ’;’を使って一行に圧縮して書いたものだが、 わかりやすく改行と字下げを行った版は別ファイルに用意してある(Ⅰ、 Ⅱ)ので参照されたい。
ループ変数(i がよく使われる)をある数値範囲に渡って変化させながらの繰り返し はよく使われる技法なので、そのための構文が各言語で用意されている(右図)。
Rubyでは幾つかの書き方が可能だが、まず ここでは for i in 範囲 do ~ end
(右図下にある)
について以下に解説しておく。
上の<範囲>とあるところに入るものとして、
1 .. 10
とか 1 ... 10
のような両端指定
ピリオド2つ(これも演算子)でつないだものは、1以上10以下の範囲、
1以上10未満の範囲(下図)を表すときは、ピリオド3つ(同上)でつないで範囲を表現できる
(下図右のように n-1を使っても意味は同じ)。
String#each_char (Ⅱの例)は、
s.split(//)
(同じくArrayを作る)でも、
同じようにループが実現できる。s[0,0]=… という書き方で、文字列の先頭に文字(や文字列)を挿入できる。
このように同じ機能を持つ複数の機能があるため、プログラムの書き方には様々なバリエーションがある(たとえば以下のコードはプログラム例1と同じ動作)。
# Ⅲのプログラム例2
r="" ; for c in s.chars do r.insert(0,c) end ; r
実は上のプログラム例Ⅰでは2つ値の入換えを1つの = 記号を使って実現している。