原です。
>あおきです。
あ、あおきさんのコードを見て、やっと正木さんが何をしたいかが分かっ
た。(^^; つまり漸化式を表現するクラスを作っていたんですね。
些細なことですが、、多分、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 をセットするのは気持ち悪くて、
ろくなもんではありませんね。(^^;