RubyのHello World

第11回は、オブジェクト指向のスクリプト言語のRubyです。RubyのHello Worldは、リスト1のようにputsを使います。putsは、文字列の終端に改行コードが付いていなければ自動的に改行を付加してくれます(すでに改行が付いていれば付加しません)。また、RubyはPerlなどとは違って、各行末にセミコロンを付ける必要がありません。

リスト1 putsを使う方法(ruby_puts)

#!/usr/bin/ruby            ← Rubyスクリプトであることを指定

puts 'Hello World'         ← putsを使ってメッセージ出力(改行コードは不要)

Rubyスクリプトは、ほかのスクリプト同様、chmodコマンドで実行属性を付ければ実行できます(実行例1)。なお、Rubyスクリプトに拡張子を付ける場合は.rbとしますが、 本稿では拡張子を付けていません。

実行例1 Rubyスクリプトの実行

$ chmod +x ruby_puts       ← Rubyスクリプトに実行属性を付ける
$ ./ruby_puts              ← Rubyスクリプトを実行
Hello World                ← 確かにHello Worldが表示される
$                          ← シェルのプロンプトに戻る

print/printfを使う方法

Perlと同様に、printやprintfを使うこともできます(リスト2、リスト3)。改行コードなどのエスケープ文字が含まれる文字列は、ダブルクォートを使う必要があります。

リスト2 printを使う方法(ruby_print)

#!/usr/bin/ruby

print "Hello World\n"       ← printを使ってメッセージ出力(改行コードが必要)

リスト3 printfを使う方法(ruby_printf)

#!/usr/bin/ruby

printf "%s\n", 'Hello World'    ← printfを使って文字列を出力

writeを使う方法

標準出力に対して、そのwriteメソッドを使って文字列を出力することもできます(リスト4)。

リスト4 writeを使う方法(ruby_write)

#!/usr/bin/ruby

STDOUT.write "Hello World\n"    ← 標準出力のwriteメソッドを実行

コマンドラインから直接実行

Rubyのプログラムをコマンドラインの引数にして直接実行するには、Perlと同様に-eオプションを使います(実行例2)。

実行例2 コマンドラインから直接実行

$ ruby -e 'puts "Hello World"'
Hello World                          ← 確かにHello Worldが表示される

OSのコマンドを呼び出す方法

OSのコマンドを呼び出すsystemを利用することもできます(リスト5)。

リスト5 systemを使う方法(ruby_system)

#!/usr/bin/ruby

system 'echo "Hello World"'          ← systemで、OS上のechoコマンドを実行

OSのコマンドをRubyプログラムの最後から呼び出す場合は、systemの代わりにexecを使えば、同じプロセスIDのまま実行され、プロセスの節約になります(リスト6)。

リスト6 execを使う方法(ruby_exec)

#!/usr/bin/ruby

exec 'echo "Hello World"'            ← OS上のechoコマンドをexecする

文字列を直接記述する方法

Rubyスクリプトの後ろに文字列を直接記述し、それをRubyスクリプト自身で読み出すという方法も考えられます(リスト7)。ここでは、「__DATA__」という文字列を目印にして、その位置までファイルを読み飛ばし、その次の1行をそのまま出力しています。「gets("\n__DATA__\n")」自身が目印と誤認されないように、__DATA__の前後に"\n"を付けている点にも注意してください。

リスト7 文字列を直接記述(ruby_data)

#!/usr/bin/ruby

file = open($0)                      ← スクリプトファイル自身をオープン
file.gets("\n__DATA__\n")            ← __DATA__の位置まで読み飛ばす
puts file.gets()                     ← その直後の1行を読み込んで表示
exit                                 ← __DATA__の部分よりも前でRubyを終了

__DATA__                             ← データの開始を示す目印
Hello World                          ← 文字列を直接記述

変則的なRubyスクリプト

スクリプトの1行目の「#!」の行に直接Rubyのコマンドを記述する方式で、変則的なRubyスクリプトを作ることができます。この行はカーネルによって直接解釈されるため、Rubyの引数部分にはスペースを入れないようにします。

リスト8は、1行コマンドをスクリプトにしたものです。スペースは\x20で表現します。

リスト8 引数に直接プログラムを記述する方法(ruby_direct)

#!/usr/bin/ruby -eputs"Hello\x20World"       ← 1行だけのRubyスクリプト

リスト9は、3行目だけを抜き出すプログラムを記述し、スクリプトの3行目に文字列を直接記述したものです。Rubyに-nオプションを付加し、whileループの記述を省略しています。

リスト9 3行目だけを抜き出す方法(ruby_line)

#!/usr/bin/ruby -neif($.==3);print;end      ← 3行目を抜き出すRubyプログラム

Hello World                                  ← 3行目にメッセージを直接記述

リスト10は、同じ発想で、正規表現を使って行を抜き出すようにしたものです。Rubyには-nオプションとともに-lオプションも付加し、各行を自動的に「chop!」しています。

リスト10 正規表現で行を抜き出す方法(ruby_regex)

#!/usr/bin/ruby -nleif(/^[^#]/);print;end    ← 正規表現でメッセージを抜き出す
                                             ← ここは空行
Hello World                                  ← メッセージを直接記述

Ruby/Tkを使ったGUI

Rubyには、GUIのライブラリも存在します。Ruby/Tkを使ったTck/Tkベースのプログラムはリスト11のとおりです。実行すると図1のウィンドウが立ち上がります。なお、以降のGUIのプログラムには終了ボタンがありませんので、ウィンドウマネージャのメニューなどで終了させてください。

リスト11 Ruby/Tkを使ったGUI(ruby_tk)

#!/usr/bin/ruby

require 'tk'                    ← tkライブラリをロード

label = TkLabel.new(            ← ラベルを作成
  'text' => 'Hello World',      ← 表示する文字列
  'width' => 22,                ← 横幅を指定
  'height' => 5                 ← 高さを指定
)
label.pack                      ← ラベルを配置する

Tk.mainloop                     ← メインループを実行

図1 Ruby/TkのHello World

Ruby/GTK2を使ったGUI

Ruby/GTK2を使う場合はリスト12、図2のようになります。

リスト12 Ruby/GTK2を使ったGUI(ruby_gtk)

#!/usr/bin/ruby

require 'gtk2'                         ← gtk2ライブラリをロード

window = Gtk::Window.new               ← トップレベルウィンドウを作成
window.signal_connect('destroy'){Gtk.main_quit}  ← destroyに対するハンドラ

label = Gtk::Label.new('Hello World')  ← 文字列を指定してラベルを作成
label.set_size_request(160, 80)        ← ラベルのサイズを指定
window.add(label)                      ← ウィンドウにラベルを張り付ける

window.show_all                        ← すべてを可視状態にする

Gtk.main                               ← メインループを実行

図2 Ruby/GTK2のHello World