ホーム‎ > ‎Ruby入門‎ > ‎

Ruby 応用編

基本編では他のプログラミング言語でも同様の話が成り立つ一般的なプログラミングの基礎を扱いました。応用編では、そのような基礎を習得した人を対象によりRubyに特化した話を扱います。
Rubyの命令は膨大なのでここで全てを網羅することは不可能です。ここでは「何ができるか?」に主眼をおいて主要な命令を紹介します。あとは皆さん自身が必要になったときに適宜リファレンスマニュアルを参照してください。

rubyを使おう
プログラミングの基礎を学んだ皆さんは既に「ある程度まとまったプログラミングが書ける」段階に到達しています。従って、ここからはテキストファイルにソースを書いてrubyで実行する方式をとりますので、その上で必要になる入出力についての事柄を纏めておきます。

1. 標準出力
標準出力とはputsやprintによる出力です。putsは文字列の最後が改行でない場合に改行を挿入します。例えば、例えば、
print "Hello world."
を実行すると、出力に改行が行われません。printでputsと同じ出力を得るためには、改行"\n"を付け加える必要があります。
print "Hello world.\n"
putsやprintは数字を出力することもできます。
puts 1
ここで注意すべきことは、1はあくまで文字列ではないことです。従って、
puts 1 + " yen"
などとするとエラーになります。正しくは、
puts 1.to_s + " yen"
あるいは
print 1," yen\n"
などとしなければなりません。

2. 標準入力
標準入力の方法も色々とありますが、一番手軽なのは"gets"を使うことです。getsを用いるとrubyの処理系がキーボードからの入力を待ちます。キーボードからの入力はEnterを押すことで終了することができます。詳しい使い勝手は
a = gets
print a
を実行していただければわかると思います。
注意すべきことは、getsによって取得されるデータは文字列であるという点です。従って、例えば入力された2つの整数の和をとるプログラムは
a = gets
b = gets
puts a.to_i + b.to_i # aは文字列。a.to_iは整数値。
となります。

3. 引数渡し
プログラム実行時に引数を渡すことができます。まず、次のプログラムを"argv.rb"に入力します。
puts ARGV[0]
これはプログラムに渡した引数のうちの初めのものをそのまま出力するプログラムです。実行すると次のようになります。
$ ruby argv.rb hoge
hoge
おわかりのように、ARGVにはプログラムの書いてあるファイル名より後ろの文字列が配列として記録されます。例えば、
$ ruby argv.rb hoge piyo
とすれば、ARGVは["hoge","piyo"]となります。

※入力方法が2つあることについて
さて、Rubyでは入力方法として標準入力と引数渡しが用意されていることを書きました。確かに、単体の文字列か配列かの違いはありますが、片方だけでもいいような気もします。どうして両方が用意されているのでしょうか?これには、Linuxというか、端末による実行の事情が存在します。

標準入出力というのは実は、キーボードによる入出力だけではなくプログラムからプログラムへのデータのやりとりまで視野に入れた仕組みなのです。例えば、keisan.rbに
puts "keisansuugaku"
suugaku.rbに
a = gets
puts a
と入力して、次の命令を実行してみましょう。
$ ruby keisan.rb | ruby suugaku.rb
すると、keisansuugakuが出力されると思います。これは次のようなことが起こっています。
  1. keisan.rbが標準出力として"keisansuugaku"を出力しようとする。
  2. パイプ"|"があるので、標準出力の先は端末ではなくパイプの向こうにあるsuugaku.rbになる。
  3. suugaku.rbが標準入力"keisansuugaku"を受け取ってputsによって出力しようとする。
  4. suugaku.rbの後ろにはパイプが無いので、標準出力は端末になる。
これによってプログラム間のデータの受け渡しがスムーズに行われます。

一方で、プログラムに引数を渡す場合、引数として想定されているのは単なるデータではなくファイル名です。従って、端末の補完機能がフルに使えます。これは、引数を入力する際にTabキーを押してみればその威力がわかると思います。

モジュール
Rubyではクラスの他にモジュールというものが存在します。こちらは、メソッドの塊のようなものです。ここでは、デフォルトで定義されているモジュールの中でも特に理系学生の皆さんに必要と思われるMathを例に使い方を説明します。irbでMathに登録されているメソッドや定数を実行すると次のようになります。
> pi = Math::PI # Mathに保存された定数PI
3.141592653589793
> Math.si
n(pi) # sin
1.2246467991473532e-16
> Math.cos(pi) # cos
-1.0
sinやcosはよく使うものなので、Mathをいちいち書くのが面倒になってきます。そのような場合は、includeを用いれば省略することができます。
> include Math
Object
> PI # Mathに保存された定数PI
3.141592653589793
> si
n(PI) # sin
1.2246467991473532e-16
> cos(PI) # cos
-1.0
他にもMathの機能は沢山用意されています。
リファレンスマニュアル module Math: http://doc.ruby-lang.org/ja/2.3.0/class/Math.html

ファイル操作(move,copy,remove)
プログラミング言語でファイル操作をするというのは一般的には面倒で避けたいものですが、Rubyにはシェルスクリプトでできる程度のファイル操作を行うために用意されたfileutilsというパッケージが用意されています。fileutilsの機能を使うためには、プログラムの先頭に次の2行を書いておきます。
require "fileutils"
include FileUtils
これで準備は完了です。例えば、ファイル"hoge.txt"を"piyo.txt"という名前でコピーしたい場合には、
cp("hoge.txt","piyo.txt")
とすれば実行されます。mv,rm,mkdirなども同様の要領で利用できます。
リファレンスマニュアル module FileUtils http://doc.ruby-lang.org/ja/2.3.0/class/FileUtils.html

ファイル操作(データ入出力)
先程のmove,copy,removeなどはそれをするだけが目的ならばわざわざスクリプトなど書かずともシェルのコマンドを用いれば十分です。同様に、自作のプログラムをLinuxのコマンドと組み合わせることでRubyでわざわざファイルを操作する手間を省くことができます。例えば、
cat data.txt | ruby hoge.rb
とすればdata.txtの内容が1行目から順番にhoge.rbのgetsに格納されますし、
ruby hoge.rb > data.txt
とすればhoge.rbでprintした内容がdata.txtに出力されます。このような工夫がどうしてもできない場合にだけ、次で説明するファイル操作を用いてください。

ファイル操作
Rubyにおけるファイル操作はFileクラスを用いて行われます。Fileクラスは実行しているディレクトリにあるファイルをもとにオブジェクトを生成します。例えば、text.txtに"keisansuugaku"と書き込むスクリプトは次のように書きます。
f = File.open("text.txt","w") # text.txtをもとにオブジェクトを作成する。
f.write("keisansuugaku")      # keisansuugakuと書き込む。
f.close                       # text.txtを閉じる。

1行目について
"File.open"は"File.new"としても同じで、Fileオブジェクトを作成する命令です。後ろの"w"は書き込み専用としてファイルを開くことを表します。2番目に入るコマンドには次のようなものがあります。
 "r"読み込み専用で開く。
 "w"ファイルの中身を空にしてから書き込み専用で開く。
 "a"書き込み専用で開く。書き込みはファイルの末尾から始める。 
 "r+"読み書き両用で開く。書き込みはファイルの先頭からの上書きモードで始める。 
 "w+"ファイルの中身を空にしてから読み書き両用で開く。 
 "a+"読み書き両用で開く。読み込みは先頭から、書き込みは末尾から始める。

2行目について
f.writeはfが表すファイルに書き込みをします。これとは逆にf.readはファイルの中身を全て文字列にします。1行づつ読み込みたい場合にはf.readlineを用います。

3行目について
ファイルを閉じます。この作業を怠るとプログラム終了後もファイルが開っぱなしになります。それで何がまずいのか、直ちにパソコンが壊れるのか、と言われればそのようなことは無いのですが、かなり大きいプログラムを書く場合にリソースが足りなくなったり、セキュリティ上の問題が発生したりするのでファイルは閉じる癖をつけておいて損はありません。
ファイルの閉じ忘れを回避するための方法としてブロックを用いるというものがありますが、こちらはここでは省略します。

リファレンスマニュアル class File: http://doc.ruby-lang.org/ja/2.3.0/class/File.html


インターネット接続
Rubyを用いてインターネットに接続することができます。勿論、メールのやりとりやSSL通信などもできてしまいますが、特にHTTP/FTP通信については簡単にできるパッケージが存在するのでここではそれに絞って解説しようと思います。
まず、HTTP通信を簡単に行うためには"open-uri"というパッケージをrequireする必要があります。そのために、ソースファイルの先頭に次の1行を入れます。
require "open-uri"
その上でメソッドopenを使います。openは引数のurlをもとにHPのソースを読み込むStringIOオブジェクトを生成します。これは、StringIOクラスはFileと同様に扱うことができるクラスです。
f = open("http://www.u-tokyo.ac.jp")
これによって、HPのソースをファイルと同じように扱えます。最後にcloseすることもお忘れなく。

練習問題
計算数学のホームページ http://www.u-tokyo.ac.jp のソースをks.txtにコピーして下さい。

答え
まず、ks.rbに次のソースを保存します。
require "open-uri"

f = open("http://www.u-tokyo.ac.jp
")
print f.read
f.close
そして、次のコマンドを実行します。
$ ruby ks.rb > ks.txt




Comments