2005-03-28 (Mon) [長年日記]
_ ローカル変数のスコープ
class SpoofSocket
attr_reader :input, :output
def initialize(s)
@input = StringIO.new(s)
@output = StringIO.new
end
for mid in [:read, :gets, :getc]
define_method(mid) do |*args|
@input.send(mid, *args)
end
end
end
というコードが動かなくてはまった。 (SpoofSocket#readで、@input.send(:getc, ...)が呼ばれてしまう。)
正しくは、
[:read, :gets, :getc].each do |mid|
define_method(mid) do |*args|
@input.send(mid, *args)
end
end
のように、ブロックを使わないといけない。
[ツッコミを入れる]