[#47049] fileのopenに関する動作についての質問 — 高橋作郎 <sakurou3960@...>

はじめまして。

14 messages 2010/05/04

[ruby-list:47052] Re: fileのopenに関する動作についての質問

From: rubikitch@...
Date: 2010-05-04 12:48:28 UTC
List: ruby-list #47052
From: 高橋作郎 <sakurou3960@gmail.com>
Subject: [ruby-list:47049] fileのopenに関する動作についての質問
Date: Tue, 4 May 2010 20:40:03 +0900

るびきちです。

>   open("q.dat", "r") do |f|
>     while line = f.gets
>       qz[n] = line.chomp
>       ans[n] = f.gets.chomp
>       n += 1
>     end
>   end
> 
> 
> 上記のサンプルだと、lineに代入されるのは f.getsで
> 配列qzと配列ansには同じ要素が代入されるように
> 僕の目には映るのですが。。。

なるほど。f.getsが固定された値(同じ変数)に見えるのですね。
しかし、f.getsはメソッド呼び出しで、getsはファイルから1行読み込むメソッドなので、
呼び出すたびに値は変化します。

あまり知られていませんが、学習にはxmpfilterというツールが便利です。
これは、行末に # => というマークを入れると、その行の式の値を書き出してくれるものです。
ループ等で2回以上その行を通ったらカンマの後で書き出されます。
出力結果もRubyスクリプトなのでエディタと組み合わせて使うと、便利です。
「gem install rcodetools」を実行するとインストールできます。

では、題意のスクリプトをxmpfilterにかけてみましょう。

$ cat sample.rb
# -*- coding: utf-8 -*-
qz = []
ans = []
n=0
open("q.dat", "r") do |f|
  while line = f.gets
    line                        # => 
    qz[n] = line.chomp          # => 
    ans[n] = f.gets.chomp       # => 
    n += 1
  end
end
$ cat q.dat
first
second
third
fourth
$ xmpfilter sample.rb
# -*- coding: utf-8 -*-
qz = []
ans = []
n=0
open("q.dat", "r") do |f|
  while line = f.gets
    line                        # => "first\n", "third\n"
    qz[n] = line.chomp          # => "first", "third"
    ans[n] = f.gets.chomp       # => "second", "fourth"
    n += 1
  end
end

では、勉強がんばってください。
--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/
Twit: http://twitter.com/rubikitch/
『Ruby逆引きハンドブック』 http://d.hatena.ne.jp/rubikitch/20090525/rubybook

In This Thread