[#13087] importing forwardable — "Akinori MUSHA" <knu@...>

 石塚さんの forwardable.rb を標準添付ライブラリにするべく、

11 messages 2001/05/02

[#13169] SizedQueue#pop causes deadlock — "Okada Jun" <yun@...>

岡田です。

18 messages 2001/05/13
[#13171] Re: SizedQueue#pop causes deadlock — "Akinori MUSHA" <knu@...> 2001/05/13

At Sun, 13 May 2001 14:11:18 +0900,

[#13176] Re: SizedQueue#pop causes deadlock — matz@... (Yukihiro Matsumoto) 2001/05/13

まつもと ゆきひろです

[#13177] Re: SizedQueue#pop causes deadlock — "Akinori MUSHA" <knu@...> 2001/05/13

At Mon, 14 May 2001 00:24:45 +0900,

[#13187] Re: SizedQueue#pop causes deadlock — matz@... (Yukihiro Matsumoto) 2001/05/13

まつもと ゆきひろです

[#13202] Re: [ruby-list:29672] Re: Enumerator — "Akinori MUSHA" <knu@...>

 ruby-dev に移ります。

26 messages 2001/05/15
[#13208] Re: [ruby-list:29672] Re: Enumerator — matz@... (Yukihiro Matsumoto) 2001/05/15

まつもと ゆきひろです

[#13259] Enumerator -- Round 2 — "Akinori MUSHA" <knu@...>

 もう一度、 Enumerable/Enumerator についてみなさんのご意見を

29 messages 2001/05/20
[#13260] Re: Enumerator -- Round 2 — matz@... (Yukihiro Matsumoto) 2001/05/20

まつもと ゆきひろです

[#13265] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/21

At Mon, 21 May 2001 06:04:32 +0900,

[#13268] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/21

原です。

[#13270] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/21

At Mon, 21 May 2001 15:00:11 +0900,

[#13289] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/22

原です。

[#13290] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/22

At Tue, 22 May 2001 19:02:10 +0900,

[#13291] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/22

原です。

[#13293] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/22

At Tue, 22 May 2001 20:57:02 +0900,

[#13305] Re: Enumerator -- Round 2 — Shin-ichiro HARA <sinara@...> 2001/05/24

原です。

[#13322] Re: Enumerator -- Round 2 — "Akinori MUSHA" <knu@...> 2001/05/24

At Thu, 24 May 2001 15:44:14 +0900,

[#13277] ext/dbm in ruby 1.7 — Kazuhiro NISHIYAMA <zn@...>

ruby 1.7のext/dbmですが、

16 messages 2001/05/21
[#13280] Re: ext/dbm in ruby 1.7 — matz@... (Yukihiro Matsumoto) 2001/05/21

まつもと ゆきひろです

[#13292] Integer("X") rescue -1 が parse error — YASUI Kentarow <kenyasui@...>

安井です。

18 messages 2001/05/22
[#13294] Re: Integer("X") rescue -1 が parse error — matz@... (Yukihiro Matsumoto) 2001/05/22

まつもと ゆきひろです

[#13295] Re: Integer("X") rescue -1 が parse error — "Akinori MUSHA" <knu@...> 2001/05/23

At Wed, 23 May 2001 08:59:50 +0900,

[#13300] 1.6.4 preview3 (Re: Re: Integer("X") rescue -1 が parse error) — matz@... (Yukihiro Matsumoto) 2001/05/24

[#13304] Re: 1.6.4 preview3 (Re: Re: Integer("X") rescue -1 が parse error) — "Akinori MUSHA" <knu@...> 2001/05/24

At Thu, 24 May 2001 14:15:04 +0900,

[#13428] mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

19 messages 2001/05/31
[#13435] Re: mswin32/ming32 system patch (experimental) — nobu.nakada@... 2001/06/01

なかだです。

[#13442] Re: mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...> 2001/06/01

こんにちは、なかむら(う)です。

[#13446] Re: mswin32/ming32 system patch (experimental) — "U.Nakamura" <usa@...> 2001/06/02

こんにちは、なかむら(う)です。

[#13450] Re: mswin32/ming32 system patch (experimental) — nobu.nakada@... 2001/06/04

なかだです。

[ruby-dev:13328] Re: Enumerator -- Round 2

From: keiju@... (石塚圭樹)
Date: 2001-05-24 15:19:12 UTC
List: ruby-dev #13328
けいじゅ@日本ラショナルソフトウェアです.

In [ruby-dev :13322 ] the message: "[ruby-dev:13322] Re: Enumerator --
Round 2 ", on May/24 21:00(JST) "Akinori MUSHA" writes:

> ところが、 Enumerator が標準で用意されると俄然状況が変わります。
>例えば、 find.rb を見てみます。現在、モジュールにはメソッドとして
>Find::find(*path) { |f| ... } のみが用意されています。
>
> Enumerator 導入後、これを次のようにしてみたらどうでしょうか。
>
>	module Find
>	  def open(*path)
>	    Enumerator.by_method(Find, :find, *path)
>	  end
>	  # Dir[] / Dir::glob からの類推
>	  alias [] open
>
>	  def find(*path)
>	    # 現行の Find::find の内容
>	  end
>	end
>
>すると、
>
>	files = Find['.'].select { |f| File.file?(f) }
>
>などということができてとても便利になります。ユーザからは特に
>Enumerator という存在は見えませんが、ライブラリ側からすると、
>この陰の存在によって手軽に Enumerable なオブジェクトを生成して
>返すことが可能になっています。

うーん... ここでFindモジュールの例を出すのは...これは、find moduleの作り
が悪だけだと思います。

明らかにFindモジュールはEnumerablbeなので、最後に添付したものように作り
直すべきでしょう。

もし、Enumeratorが役に立つとしたらば、Enumerableなあるクラスがデフォルト
のeach以外に他のメソッドでもenum出きるときだけだと思います。その他の場合
は積極的にeachを定義してEnumerableをincludeすべきです。

# 私の提案: 今あるモジュール/クラスでもenumっぽいものは積極的に
#           Enumerableにしよう!!

ということは、Enumeratorそのものももうちょっと考えなくては行けないってこ
とを意味しているでしょうね。

##-- my find module
# とはいえ最近検証していないので動かないかも(^^;;;

# Usage:
#	require "find.rb"
#
#	Find.find('/foo','/bar') {|f| ...}
#  or
#	find = Find.new('/foo', '/bar')
#	for f in find
#          ...
#       end
#
# メソッド:
#    Find.new(*path)
#           pathを検索すべきディレクトリリストとしてFindオブジェクトを
#           生成.
#    Find.find(*path) {|path| ...}
#           pathを検索すべきディレクトリリストとし, 検索を行なう. 各ファ
#           イルはpathに渡される. 
#    Find.grep
#	    未実装
#    Find.members(pattern, *path)
#	    ディレクトリリストpathを検索ツリーとし, そのツリー上のファ
#	    イルでpatternにマッチするファイルのリストを返す. イテレー
#	    タとして呼ばれた時には, マッチしたファイル毎にブロックを呼
#	    び出す.
#    Find.prune
#	    現在のディレクトリのディレクトリツリーをこれ以上検索しない.
#    Find#if_can_not_open {|f|
#	    ファイルがオープンできない時の処理をブロックに渡す. ブロッ
#	    ク引数には, そのパス名が渡る. デフォルトの動作はワーニング
#	    を出して, pruneする
#    Find#each
#           検索ツリーから1ファイルずつブロックに渡す.
#    Find#prune
#	    現在のディレクトリのディレクトリツリーをこれ以上検索しない.
#    Find#break
#	    検索の中止
#    Find#depth_first(TRUE)
#	    深さ優先探索をするかどうか? デフォルトは深さ優先探索.
#    Find#directory_first(TRUE)
#	    ディレクトリツリーの検索で最初にディレクトリを渡すか? デフォ
#	    ルトはディレクトリを最初に渡す.
#    Find#prune_symlink(TRUE)
#	    シンボリックリンクの先をたどるか? デフォルトはたどらない.
#
#

class Find
  include Enumerable
  
  def Find.new(*path)
    find = super
    return find
  end
  
  def Find.find(*path)
    find = new(*path)
    for file in find 
      yield file
    end
  end

  def Find.prune
    throw :FIND_PRUNE
  end
  
  def Find.grep(pattern, *path)
    find = new(*path)
    if iterator?
      find.grep(pattern) do
	|file|
	yield file
      end
    else
      return find.grep(pattern)
    end
  end
  
  def Find.members(pattern, *path)
    find = new(*path)
    if iterator?
      for file in find
	if file.index(pattern)
	  yield file
	end
      end
    else
      collect = []
      for file in find
	if file.index(pattern)
	  collect.push file
	end
      end
      return collect
    end
  end
    
  def initialize(*path)
    @path = path.reverse
    if_can_not_open
    @depth_first = TRUE
    @directory_first = TRUE
    @prune_symlink = TRUE
  end
  
  attr :depth_first, TRUE
  attr :directory_first, TRUE
  attr :prune_symlink, TRUE
  
  def if_can_not_open
    if iterator?
      @if_can_not_open = proc
    else
      @if_can_not_open = proc {
	|f|
	printf "%s: Permission denied\n", f
	prune
      }
    end
  end
  
  def each
    catch :FIND_BREAK do
#      while file = @path.pop
      while (file = @path.pop
	     file)
#	print file.inspect, @path.inspect, "\n"
	catch :FIND_PRUNE do
	  if @directory_first
	    yield file
	  else
	    if file.kind_of?(Array)
	      yield file[0]
	      next
	    elsif node?(file)
	      if @depth_first
		@path.push [file]
	      else
		@path.unshift [file]
	      end
	    else
	      yield file
	      next
	    end
	  end
	  
	  if node?(file)
	    if not File.readable? file
	      @if_can_not_open.call(file)
	    end
	    d = Dir.open(file)
	    begin
	      for f in d
		next if f == "." or f == ".."
		if file == "/"
		  f = "/" + f
		else
		  f = file + "/" + f
		end
		if @depth_first
		  @path.push f
		else
		  @path.unshift f
		end
	      end
	    ensure
	      d.close
	    end
	  end
	end
      end
    end
  end
  
  def prune
    throw :FIND_PRUNE
  end
  
  def break
    throw :FIND_BREAK
  end
  public :break

  def node?(file)
    File.directory? file and
    not (@prune_symlink and File.symlink? file)
  end
  private :node?
  
end
__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju@rational.com <<---

In This Thread