Ruby : 移植性

作成日 : 2023-03-12
最終更新日 :

他の言語から Ruby に書き直す

私は Ruby のプログラムをそれほど書いていない。なので、プログラムを書いて Ruby に親しみたい。 手元に奥村晴彦著の「改訂新版 C 言語による標準アルゴリズム事典」があるので、これを Ruby で書き直してみたらどうかと思い立った。 以下は悪戦苦闘の記録である。

カウンタが減る for ループ

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) とするのが正しい。

continue 文

C 言語の continue 文に相当するのは、Ruby では next である。

static 指定子

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 : 移植性


MARUYAMA Satosi