私は Ruby のプログラムをそれほど書いていない。なので、プログラムを書いて Ruby に親しみたい。 手元に奥村晴彦著の「改訂新版 C 言語による標準アルゴリズム事典」があるので、これを Ruby で書き直してみたらどうかと思い立った。 以下は悪戦苦闘の記録である。
C 言語では反復を for
で表す。カウンタを
i とすれば、
for (i = 0; i < n; i++)
のような式がよく出てくる。これを
Ruby で書けば、
for i in (0 .. n-1)
のような式になるだろう。一方で、C 言語で
for ( i = n - 1; i--; i>=0)
のような式もたまに出てくる。
これを Ruby で表そうとして、for i in (n-1 .. 0)
とすると誤りである。for i in (n-1 .. 0).step(-1)
とするのが正しい。
C 言語の continue 文に相当するのは、Ruby では next である。
C 言語の関数内でstatic が指定されると、静的変数の定義となる。 関数が終了しても消滅せず、再び同じ関数を呼び出した場合は前回の値がそのまま残っていることを表す。 これを Ruby で実現する方法を私は知らない。再帰関数の深さを知るために使う場合は、 再帰関数の引数に深さを指定するとともに、呼び出しのトップで引数にゼロを、再帰関数の内部で深さを表す引数に 1 を加えて再帰関数を呼び出すようにするといい。
C 言語では float.h や math.h などのヘッダファイルに各種定数が指定されているが、 Ruby では定数が指定されていないことがある。
C 言語の書式付き出力は printf
を使い、 書式付き入力は
scanf
を使う。 Ruby で入力するときは、str = gets()
で文字列を得てから str を加工する。または直接、整数を得るのであれば、
n = gets().to_i
でよい。なお、C 言語の printf はそのまま Ruby
でも使える。
配列のオブジェクトは自らが大きさ(長さ)の情報を持っている。Array#size または Array#length である。
オブジェクト a
に一定の大きさ
n
の配列の領域を確保するには、a = Array.new(n)
とする。このとき、a[i]
には nil が入っている。特定の値
v
で初期化するには、
a = Array.new(n, v)
とする。このとき、要素ごとに
v
が複製されるわけではないことに注意すること。全要素が同じオブジェクト
v
を参照する。C 言語で static 指定子がある変数は、0 または 0.0
で初期化されるので、移植時に注意する。
まりんきょ学問所 > Rubyの浮き輪 > Ruby : 移植性