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
のように、ブロックを使わないといけない。