原始的Ruby入門

最近、Rubyを書いていないので再入門しようと思い、Hello Worldチュートリアルを書こうと思う。

まず、Rubyを入手する。ここから最新のソースを入手し、コンパイルしておこう。何事も新しいのはいいことだと思う。とりあえず、今回は、安定版の最新ソースを入手。

次に、お好きな vim で新しいファイルを作る。ファイルをつくるのは、先ほど落としたRubyのソースと同じディレクトリがいいだろう。ファイルの先頭には、おきまりのおまじないを書かなくてはいけない。

#include "ruby.h"

これは、Rubyを勉強していくうちに理解できると思う。

Rubyは、完全なオブジェクト指向言語なので(信じられるかい?数値や文字列までオブジェクトなんだ。Javaのようにプリミティブな型なんて存在しない。)、まずはオブジェクトを作成しなければならない。作成の方法は、

VALUE my_obj = rb_class_new_instance(0,0,rb_cObject);

これで、Objectクラスのインスタンスmy_objが作成された。

次に、今回のHello Worldプログラムでは、標準出力に文字を書き出さないといけない。Rubyでは、Kernelモジュールのメソッドとして、putsというのが用意されている。実は、Objectクラスには、最初からKernelモジュールがインクルードされているので、何もしなくてよい(何をいっているかわからなくても大丈夫。そのうちわかるから。)

次に、putsメソッドを呼び出すためのおまじない。

int method_id = rb_intern("puts");

これもおまじないなので、何をやっているかわからなくても大丈夫。(RubyはメソッドをIDで管理しているんだ。これは、"puts"のIDをとりだしている)

そして、実際にメソッドを呼び出す。

rb_funcall(my_obj,method_id,1,rb_str_new2("hello world"));

引数は順に、オブジェクト、おまじないで取り出したID、メソッドの引数の数、メソッドへの引数...になる。今回わたしている引数で使っているrb_str_new2というのは、(null終端されている)文字列を文字列クラスに変えている。上でも書いたけど、文字列もクラスなんだ。

これで、重要な部分は終わり。あとは、いくつかおまじないを書い手あげれば完成。最終的にファイルは、このようになる。

#include "ruby.h"

int main()
{
    VALUE obj;
    int method_id;

    ruby_init();
    ruby_init_loadpath();
    ruby_script("hello_ruby");

    my_obj = rb_class_new_instance(0,0,rb_cObject);
    method_id = rb_intern("puts");
    rb_funcall(my_obj,method_id,1,rb_str_new2("hello world"));

    ruby_finalize();
    return 0;
}

さて、いよいよお楽しみの実行だ。shellに次のように打ち込むんだ。

$gcc -o hello_ruby -I${Ruby_DIR} -g -L${Ruby_DIR} -lruby -ldl hello_ruby.c && ./hello_ruby
hello world

${Ruby_DIR}と書いてある部分は、適宜おとしたRubyディレクトリを指すようにして実行してみよう。

今回書いてみてわかったと思うけど、Rubyを書くにはおまじないがいっぱい必要になる。きっと、これがRubyは黒魔術がどうこういわれるゆえんなんだろうね。

終わりに:
ついカッとなってやった。これ書く前に、昔読んだRubyの本に、Hello Worldがインディアンの掟とか、Hello World書いて動かして、掟守られたとか書かれていた記憶があって、それを参照しようと思ったんだけど、どうしてもその本が思い出せなかった。自分が最初にRubyを書くきっかけになった、256本網道編で書かれていたかとずっと思っていたんだけど違った。だれか知っていたら教えてください。
あと、調べるのにRubyアプリケーションプログラミングって本も探したら、平成14年の本なのに、ちょこっとだがテストファーストプログラミングとかのっていて驚いた。どうも、テストファーストってきくと最近のイメージがあるからなぁ。さすがだね、オーム社

プログラミングRuby 第2版 言語編

プログラミングRuby 第2版 言語編

Rubyアプリケーションプログラミング

Rubyアプリケーションプログラミング