原です。

>あおきです。

あ、あおきさんのコードを見て、やっと正木さんが何をしたいかが分かっ
た。(^^; つまり漸化式を表現するクラスを作っていたんですね。

些細なことですが、、多分、new の第2引数以降は必要ないことがほとんどで
しょうね。一応再録すると

class Sequence

   include Enumerable

   def initialize( list, &block )
     @list = list
     @proc = block
   end

   def []( n )
     @list[n] ||= @proc.call( self, n )
   end

   def each
     i = 0
     loop do
       yield self[i]; i += 1
     end
   end

end

def (Power = {}).[]( x )
   super || Power[x] = Sequence.new([1]) {|seq, n| x * seq[n-1] }
end

m = ARGV[0].to_i

Power[3].each do |x|
   p x
   break if x > m
end

で、十分じゃないですかね。Prime だったら、

Prime = Sequence.new([2,3]){|seq, n|
   m = seq[n - 1] + 2
   m += 2 while seq.find{|k|
     break if k * k > m
     m % k == 0
   }
   m
}

Prime.each do |x|
   p x
   break if x > 100
end

ですか。

ああ、いいなあ、 「入門」にはこっちを書けばよかったかなあ。

self をどうしても使いたければ、こういうことになりますかね。

class Sequence
   attr_reader :n

   include Enumerable

   def initialize( list, &block )
     @list = list
     @proc = block
   end

   def []( n )
     @n = n
     @list[n] ||= instance_eval(&@proc)
   end

   def each
     i = 0
     loop do
       yield self[i]; i += 1
     end
   end
end


def (Power = {}).[]( x )
   super || Power[x] = Sequence.new([1]) { x * self[n-1] }
end

Prime = Sequence.new([2,3]){
   m = self[n-1] + 2
   m += 2 while find{|k|
     break if k*k > m
     m % k == 0
   }
   m
}

instance_eval がいかに気持ち悪いものか。:-)

こういうのもあるけど、

class Sequence
   include Enumerable

   def initialize( list, &block )
     @list = list
     @proc = block
   end

   def []( n )
     @n = n
     @list[n] ||= instance_eval(&@proc)
   end

   def each
     i = 0
     loop do
       yield self[i]; i += 1
     end
   end

   def to_ary
     [@n]
   end
end


def (Power = {}).[]( x )
   super || Power[x] = Sequence.new([1]) { |n,| x * self[n-1] }
end

Prime = Sequence.new([2,3]){ |n,|
   m = self[n-1] + 2
   m += 2 while find{|k|
     break if k*k > m
     m % k == 0
   }
   m
}

どっちにしろインスタンス変数に n をセットするのは気持ち悪くて、
ろくなもんではありませんね。(^^;