Ruby / filename、file、txt なんて変数三つも使う理由 / bash

| | コメント(0) | トラックバック(0)

Sanmba の他にも Ruby を再学習しているところ。
たのしいRuby 第2版 Rubyではじめる気軽なプログラミング
の50ページにこんなソースが。


#read_txt.rb
filename = ARGV[0]
file = open(filename)
txt = file.read
print txt
file.close

これは read_txt.rb の引数(ファイル名)を

・開いて
・読み込んで
・出力して
・閉じる

っていう挙動をします。

read_txt.rbと同じ階層内に下記のようなファイルを置いて、


#abcd.txt
aaa
bbb
ccc
ddd
eee

で実行。

$ ruby read_txt.rb abcd.txt
#=>
aaa
bbb
ccc
ddd
eee


と出力されるわけなんですな。
でもなんかすっと落とし込めないんだよね。
実際に頭に入ってこない。
っていうのも

1. [ filename、file、txt なんて変数三つも使う理由 ]
2. [ もっと人間的な動作で例えられないのかな ]

という二点から。

実際に試してみる。
まずは1. filename、file、txt なんて変数三つも使う理由から。
先述したread_txt.rbでなるべく変数を使わないで書いてみる。

#kaitemita.rb
print open(ARGV[0]).read
open(ARGV[0]).close

で実行する。

$ ruby kaitemita.rb abcd.txt
#=>
aaa
bbb
ccc
ddd
eee
同じやーん。結局は見易さなの? いやいやそんなはずはない。変数使用の理由は絶対にあるはず。 そこで次の項で扱われている、getsメソッドを使用した gets_txt.rb と 変数を使わないバージョンを続けて書いて試してみる。
#tsuduketekaita.rb

###gets_txt.rb
filename = ARGV[0]
file = open(filename)
while txt = file.gets do
print txt
end
file.close

print "\n===========","\n"#区切り
###変数なしで書く。
while open(ARGV[0]).gets do
print open(ARGV[0]).gets
end
open(ARGV[0]).close


実行

$ ruby tsuduketekaita.rb abcd.txt
#=>
aaa
bbb
ccc
ddd
eee
===========
aaa
aaa
aaa
aaa
aaa
(ループするのでCtr + Cで終了)
tsuduketekaita.rb:13: Interrupt

なんか挙動が違いますね。
終了時のメッセージを見ると13行目の処理を行っていたとこでしたとな。
これ何回か繰り返してメッセージをみてみるとわかると思いますけど、
とりあえず変数無しバージョンは while のところを延々と回ってるみたいですね。だからループするわけ。
そして "aaa" ばっかり出力されちゃうのは、毎回 open(ARGV[0]).gets しちゃうからなんですね。
つまり新しくファイルオブジェクトを open してから gets を繰り返すから最初の一行しか print されないんだわ。
で、ずっと一行目だから nil にならねーんでループってわけ。
んー納得、と思ったところでひらめき。もしやこういうこと?

#!/bin/bash
a=`date`
date
sleep 10
date
echo ${a}

なーるほどね。実行してみるべし。
おもったより長くなってしまったので
2. [ もっと人間的な動作で例えられないのかな ]
については次のエントリで。

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ (2006/08/05)
売り上げランキング: 4000

トラックバック(0)

このブログ記事を参照しているブログ一覧: Ruby / filename、file、txt なんて変数三つも使う理由 / bash

このブログ記事に対するトラックバックURL: http://jippenshar.com/igc/mt/mt-tb.cgi/106

コメントする

このブログ記事について

このページは、YNが2008年1月16日 10:31に書いたブログ記事です。

ひとつ前のブログ記事は「Samba 設定云々 / Lpic Level 1 総括」です。

次のブログ記事は「Ruby / もっと人間的な動作で例えられないのかな」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

フィードメーター - 十返舎.com あわせて読みたいブログパーツ
QLOOKアクセス解析
Powered by Movable Type 4.22-ja

Firefox3 Meter