コンピュータのプログラムは、メモリ(内臓メモリ;ICやLSIなどの電子回路で作られ、 CPUに近い転送速度(実際にはCPUよりやや遅いがキャッシュ技術を活用してその格差を吸収させている) で処理を行っている。
が、このメモリは揮発性(電源を切ると情報が消失する)のため、必要に応じて 不揮発性の記憶場所に保存する必要があり、
コンピュータには ハードディスクやSSDなどの不揮発性記憶装置が不可欠のものとして装備されている。
この記憶装置の内容を効率的に整理するため、「ファイル」という概念が使われ、 そのファイルに関する目録情報をフォルダ(もしくはディレクトリ)に記録することで、 階層的(一般的に木構造)のファイルシステムが実現されている。
本章はプログラムからファイルにアクセスする時に考え方を解説する。
実行時に コマンドプロンプトで
ruby xxxx.rb > aaaaa.txt
のように入れると 結果は画面ではなくファイルに書き込まれる(出力リダイレクト)
同様に
ruby xxxx.rb < aaaaa.txt
のようにすると、ファイルから読み込む
入力リダイレクトと出力リダイレクトは併用可能(どちらが先でもいい)
Fileオブジェクトを使うのが一般的
伝統的な書き方は、
f=File.open("xxx.txt")
puts f.gets
f.close()
のように、Fileクラスのメソッド(gets, close)を使う書き方。
ファイル名 or パス名
⇡ カレントフォルダに置かれたもの
↓ open
ファイルハンドル(?)
⇡ 読む 書く
↓
最後に close
ただし、
最初の段階では
Fileオブジェクト(のインスタンス)が作られていないので、
open(または
new)の段階のみ、インスタンスメソッドではなく、特異メソッドを使う。
File.openの代わりに Kernel.#openが使える
なので
open("xxx.txt") do |f|
puts f.gets # puts(f.gets) や puts(f.gets()) も同じ意味
end
と書くこともできる
従来のプログラミングの考え方では、open から close に至る流れを、縦に並べて (逐次的に)書いて、順々に「実行」させていた。
Fileに対する操作の場合、読み書き操作の(プログラム内で)対象となるオブジェクト (インスタンス)を最初に生成し(取っ掛かり、ハンドルのような意味合い)、 その後のプログラムコードはそのオブジェクトに対する処理として書くことになる(下左図)。
プログラミングでは、たとえば while というキーワードで条件付きの繰り返しが 基本的な制御構造として使われる(上右図)。
さらに、昨今の関数型言語では、繰り返しやその他の定型的な処理をさせるために、 関数(もしくはメソッド)の引数の一つとして、 呼び出すべき処理や関数を渡すような書き方が定着しつつある (下左図はJavaScript言語での受け渡しのイメージ)。
Rubyでは引数として括弧内に書く代わりに、引数列の後ろにブロックとして記述する
形になる。
ブロックはbegin 〜 end (Algol言語の流れをくむ)または
{
〜 }
(C言語などで広く使われる)どちらで囲んでもいい。
ブロックを囲む記号や単語の位置関係は、必ずしも同じ行内で向き合っている 必要はなく、改行を隔てて(離れた行に)置かれていてもよく、 意味的に向かい合っていれば大丈夫。
ブロック内の先頭に(たて棒文字 |
で囲んで)
ブロック変数を定義することができる。
ブロック変数は、
関数の引数と同様に、そのブロック内で一時的な変数として扱われ、
そのブロックを支配する関数や制御構造からその初期値が与えれれる。
File.open メソッド(ブロック付き呼び出し)の場合は、 open されたFile オブジェクトが ブロック変数の値として渡されることになる。
open(File#openまたはKernel.#open) の第2引数に “w” を指定する。
open("xxx.txt","w") do |f|
f.puts("この文字列が書き込まれます")
end
open("xxx.txt","w") do |f|
20.times do |i|
f.puts "i: #{Time.now.to_s}"
sleep 1
end
end
#{…}
の。中の5は評価され展開される20.times
は I
teger#timesを使った繰り返しの例Time.now.to_s
では メソッドチェーンが行われている。( Time.now
と Time#to_sを確認下さい(本問は各自考えてみて下さい) コンソールから入力した文字をファイル(名前は適当に指定)に書き出すプログラムを(リダイレクトを使わずに)書いてみて下さい)