From: Shin-ichiro HARA Date: 2002-11-11T16:37:07+09:00 Subject: [ruby-dev:18734] Re: Enumerable#zip 原です。 In [ruby-dev:18729] Re: Enumerable#zip Tanaka Akira writes: >zip が呼ばれた時点で each を呼び出す(終らせる)必要はなく、zip の返り値 >に対して each が呼び出された時点で(Generator で)並行に進めていけばいい >ので、そういうものがなくてもなんとかなります。 これは具体的には次のようにすればいいですね。 ----^ sync_each.rb require "generator.rb" #[ruby-dev:18713] def zip(*args) o = Struct.new(:args).new(args) def o.each generators = args.collect{|x| x.generator(:each)} while generators.any?{|x| x.more?} yield generators.collect{|x| x.next rescue nil} end end o end class Rand def each while true yield rand(10) end end end a = Rand.new b = Rand.new for x,y in zip(a,b) p [x, y] break if x == y end ----$ sync_each.rb 青木@横浜さんの each_step.rb は、無限 each を持つクラスに対しては自分 で next を定義すべし、とあるけど、それはそのクラスの内部に立ち入らない とできません。この generator.rb は、それが必要ないところがミソですね。 ところで、この Rand クラスの例は、「二人で数字を出し合って一致するまで のゲームの回数を調べる実験」なんですが、「無限列を複数同時に走らせ、し かも zip は有限回で終わる(終える)本質的な例」になっているんじゃない でしょうか。 つまり、平行 each には需要がある、と言いたいわけです。