[#23168] File.fnmatch のリファクタリング — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

13 messages 2004/03/08

[#23192] File.fnmatch と Dir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

19 messages 2004/03/13
[#23194] Re: File.fnmatch と Dir.glob の非互換部分 — matz@... (Yukihiro Matsumoto) 2004/03/13

まつもと ゆきひろです

[#23195] Re: File.fnmatch とDir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/03/14

山本です。

[#23196] Re: File.fnmatch とDir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/03/14

山本です。

[#23260] Re: File.fnmatch とDir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/03/30

山本です。

[#23261] Re: File.fnmatch とDir.glob の非互換部分 — matz@... (Yukihiro Matsumoto) 2004/03/30

まつもと ゆきひろです

[#23265] Re: File.fnmatch とDir.glob の非互換部分 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/03/30

山本です。

[#23238] Re: [ruby-cvs] ruby, ruby/lib, ruby/lib/rss, ruby/sample/openssl: * lib/logger.rb: trim tail space of each line. no user visible change. — Kouhei Sutou <kou@...>

須藤です.

10 messages 2004/03/27

[ruby-dev:23287] Re: ensure modifier

From: "NAKAMURA, Hiroshi" <nakahiro@...>
Date: 2004-03-31 02:09:16 UTC
List: ruby-dev #23287
なひです。

> From: "Yukihiro Matsumoto" <matz@ruby-lang.org>
> Sent: Wednesday, March 31, 2004 10:43 AM

> |>   (var = expr) ensure expr_e
> |> 
> |> と解釈されるべきのような気がします。まあ、どうせ例外が発生す
> |> るんで意味ないといえばその通りなんですが。
> |
> |てことは、この部分が不要?
> 
> そういうことでしょうね(メール出してから気がつきました)。
> 
> rescue modifierに反対ではないんで、ここを削ってコミットして
> くださいませんか。

なひはensure modifierには今のところ反対です。

なひがensureを使う場合、現在は、以下のように書いています。

  xxx
  begin
    zzz
  ensure
    yyy
  end

この時、意味的に対応しているのは、xxxとyyyです。例えば

  f = File.open(...)
  begin
    f.read
    ...
  ensure
    f.close
  end

など。xxx <-> yyyで、open <-> closeという対応です。
(余談) f = File.openをblockに入れて、ensureをf.close if fにする、
というスタイルもあると思います。なひも以前はそうでした。好みの
問題だと思います。

で、今回のensure modifierでこれを書くと、
  xxx
  zzz ensure yyy
となるのですが、これは、意味的には直接関係のないzzzとyyyが、文法上
結びついており、この点が納得できません。rescue modifierに関しては、
  xxx rescue yyy
で、xxxが上げる例外をyyyで処理する、と対応が取れているのと比べると、
対照的に思えます。

対応が取れておらず、なひがあまり納得できない使いかたの例としては、

  if block_given?
    yield(self) ensure self.close
  else
    self
  end

(IRCでの、のかださんによるサンプルを拝借)があります。

ensure modifierで対応が取れるようにするためには、まつもとさんの例の
ように、

  (str = (f = File.open(...).read)) ensure f.close

もしくは、

  $f = ...
  STDOUT << File.open($f).read.gsub(/\n/, '') ensure File.unlink($f)

のように、method chainや代入で連結することになると思いますが、
こんなに複雑なのは、おそらく使われないんじゃないかなぁ。

In This Thread