# reject されて悔しいからもう一回書く :-)


In message <20000827220323t6K1r?@mbf.nifty.com>
zn / mbf.nifty.com writes:

> Kenya Ogata <k_ogata / mbd.nifty.com> wrote:
> > Doc プロジェクトで 「Ruby の落とし穴」っていうのがあっても
> > 良いかもしれませんね。
> > 今回のような物を、質問者がまとめて投稿するということで。
> 
> とりあえず「Ruby の落とし穴」スレッドを作ってMLで経験談を
> 募ってみるのが良いかもしれません。

では,あんまりでなさそうなところを :-)


* File を open してほったらかしにするようなコーディングをしていると,
  たとえば SunOS 4.X みたいな変なシステムでびっくりできます.

  # stdio でファイルディスクリプタを char でもってる.だもんで,どんど
  # んファイル開いていくと,そのうちファイルディスクリプタが負になって
  # EBADF.

    while
      str = File.open(name).read
        :
    end

  で close を GC 任せにしたりせず,

    while
      begin
        f = File.open(name)
        str = f.read
      ensure
        f.close
      end
        :
    end

  とか
    
    str = nil
    while
      File.open(name) { |f| str = f.read }
        :
    end

  とか,close が保証されるようにしといた方が,無難.


* IO からの読み出しは毎回新たなオブジェクトを生成します.ふつうは平気
  ですが,意識していないとはた迷惑なプログラムが出来上がる場合がありま
  す.

  # 400byte ほどのブロック二つを連結したものが別のバイナリファイルに入っ
  # ているかを調べるプログラムを作った時のこと.総ブロック数 400 個ほ
  # どを調べるのにスクリプトの中でループしてたら,たまにシステム全体が
  # 一分程固まったりして.メモリ足りないとはいえ,これは良くない.

  必要に応じて [ruby-list:23467] みたいなものを作る方が良いでしょう.
  もっと良いのはこんなことに ruby を使わないことかもしれないけど.


* nil.to_s は "" なのに,puts nil や print nil が "nil" を表示するのが
  嬉しい人っているんでしょうか?


* fork が 0 や -1 を返すと思っていたりしませんか.失敗した時には例外が
  あがり,子プロセスには nil がわたるんですが.


* 文字列展開について.

    > ruby -e 'h = {"1" => "foo"}; puts "1".sub(/(\d)/, "#{h[\1]}")'
    -e:1: compile error in string expansion (SyntaxError)
    -e:1: parse error
    h[\1]
       ^
    > ruby -e 'h = {"1" => "foo"}; puts "1".sub(/(\d)/, "#{h[\\1]}")' 
    -e:1: compile error in string expansion (SyntaxError)
    -e:1: parse error
    h[\\1]
       ^
    > ruby -e 'h = {"1" => "foo"}; puts "1".sub(/(\d)/, "#{h[\\\1]}")' 
    -e:1: compile error in string expansion (SyntaxError)
    -e:1: parse error
    h[\\\1]
       ^
    > ruby -e 'h = {"1" => "foo"}; puts "1".sub(/(\d)/, "#{h[\\\\1]}")' 
    -e:1: compile error in string expansion (SyntaxError)
    -e:1: parse error
    h[\\\\1]
       ^

  ....書けません :-) こうしときましょ.

    > ruby -e 'h = {"1" => "foo"}; puts "1".sub(/(\d)/) { "#{h[$1]}" }' 
    foo


# 変なことでばっかり引っかかってるのだな.


-- 
柳川和久 @ 東大阪市 . 大阪府                                August 29, 2000
Translaters, traitors.