Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

ruby初心者日記

とうとう macbook 買ってしまいました。おどろいたのは、電気入れるとディスプレイ裏の林檎マークが光るんです。飾りかと思ってた。ちなみに関係ないですが、わたくしは椎名林檎好きなので、このマークはとても気に入りました。

さて、そんな感じでノートPCも新しくなったことだし、気分を変えてちょっと ruby でもやってみようと思ったところ、色々とはまったりしたのでメモっておきます。

ファイルクローズの不思議?

こんな↓関数を作って

def save(dat)
  open('hoge.txt','w').write(dat)
end
def load
  return open('hoge.txt').read()
end

こんな↓感じで呼び出したところ

irb(main):002:0> save('hage')
=> 4
irb(main):003:0> p load
""
=> nil

どうもうまくファイルが読み込めない。どうやら、

def save(dat)
  f = open('hoge.txt','w')
  f.write(dat)
  f.close # or flush
end

としなければいけないようだ。ruby ではブロックを抜けるとファイルハンドルが close される、と覚えていたのだけど、関数を抜けるときはcloseされないのだろうか??ちょっとぐぐったところ、

open('hoge.txt','w') {|f| f.write(dat)}

と書けば、close はいらないようだ。

stack level too deep

こんなコードを書いてたら、stack level too deep というエラーが出た。

class Hoge
  def warn(message)
    now = Time.now.strftime("%H:%M:%S")
    warn "[#{now}] #{message}"
  end
・・・

warn を $stderr.puts としたら出なくなった感じ?たぶんだけど。

end of file reached

ruby版Mechanize を使っていたら、end of file reached というエラーが出た。
ファイルクローズやら何やら色々とはまった後だったし、きっと自分の書き方が悪いんだろうと思って散々悩んで時間かけたあと、mechazine のバグらしいことが判明。。。やられた。mechanize-0.6.8を入れたけど、疲れたので検証は明日やることにする。