プログラミング言語/Ruby


Rubyそぞろ歩き

 というわけでPerlの入門書"Learning Perl"(Randal L.Schwartz)、通称リャマ本から 順当にパクって行きたいと思います。

 これから小規模なプログラムを書きながらRubyの様々な機能に触れていくわけ ですが、Rubyはbeauty Perlたり得てもbeauty Perlそのものではありません。

 入門書として極めて優れたリャマ本にならい、個々の機能に関する説明は 簡単に済ませますし、Perlのソースがベースかつ複雑な機能は使わないという方針の サンプルプログラムにはかなりRuby Wayではない書き方も沢山あります。 このドキュメントに現れた書き方に決して固執しないようにしてください。

1. "Hello, world"プログラム

 さて、とりあえず何かさせてみましょう。 以下はチュートリアル文書の通過儀礼とでも言うべき例のプログラムの Ruby版です。*1

#!/usr/bin/ruby
print "Hello, world!\n"

 1行目は、このプログラムがRubyプログラムであることをシェルに伝えるものです。 Ruby自身にとってはコメントになっています。 多くのシェルやawk、そしてもちろんPerlと同じように、シャープ記号(#)から行末までが コメントです。

 2行目が、このプログラム中に実行される仕事のすべてです。 あらかじめ用意されているprintという機能を呼び出して、コンソールへの 出力を成し遂げます。

 PerlやCでは、このような単純文は最後にセミコロン(;)で終わるところですが、 Rubyではそれが改行に取って代わります。もちろんセミコロンも同様に機能しますが、 Ruby Wayではありません。

 この文はBasicな道を通ってきた人には命令のように映るかもしれません。しかし print(...)のようにカッコをつけると関数のように見えるでしょう。 正解はどっちでもなくてメソッド呼び出しなのですが、この意味がわからなくても 支障はあまりありません。

2. 質問してその答えを覚えておくこと

今度は、少しだけ凝ったことをしてみましょう。hello, worldという挨拶は、 よそよそしくて他人行儀な感じがします。そこで、相手の名前を呼びかける ようにしてみましょう。これを実現するには、

 入力された名前のような、値を保持する手段として変数があります。 Rubyにはいくつかの種類がありますが、ここではローカル変数を用います。 "name"のように、素直にアルファベッドで変数を命名してください。

 次に名前の入力ですが、コンソールプログラムでは、プロンプトと呼ばれる 入力を要求するような旨の文章や記号を印字して、ユーザーからの入力を待ち受ける のが一般的です。 この仕事のうち、プロンプトの印字については前回のプログラムですでに方法を学んでいる と思います。printを使うのです。あとは入力を受け付ける手段です。

 これはRuby内で標準入力を表すSTDINというモノに関わります。 Rubyにおけるモノ(=オブジェクト)には、それぞれ様々な機能(=メソッド)が備わっていて、 それらを呼び出すことによってRubyのプログラムは進行します。 今回用いるのは、STDINが持つgetsというメソッドです。これは入力を一行読み込みます。 つまり、キーボードからだとエンターキーで入力を終わるということです。

 以上をまとめると、次のようになります。

print "名前は? "
name = STDIN.gets

 この時点では、nameの値の末尾には、改行文字(\n)がくっついています(例えば Vipperと入力したら、nameの値はVipper\nになっています)。 この改行文字を取り除くには、chop!を使います。

 入力され、nameに保持された値は当然文字列なので、Ruby内ではStringという モノの種類(=クラス)から生み出されたものです。 chop!は、Stringオブジェクトが持つメソッドです。自らが表している文字列の 内容の末尾を、1字ぶん削ります*2

name.chop!

 ここまでくれば、あとはHelloと表示して、その後ろに変数nameの内容を表示する だけです。これは、ダブルクォート(")で囲んだ文字列の中に値を埋め込む 「#{...}」という記法(式展開)を使って行います。 シェルやPerlの似たようなそれとは違い、Rubyでは式なら何でも書けます。

print "Hello, #{name}!\n"

 これらをまとめると次のプログラムが得られます。

#!/usr/bin/ruby
print "名前は? "
name = STDIN.gets
name.chop!
print "Hello, #{name}!\n"

*1 行番号をつけるのは本文書独自の方針です。リャマ本にはありません
*2 1字、というのは正確ではなく、実際は1バイト

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS