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 |