トップ «前の日記(2005-03-27 (Sun)) 最新 次の日記(2005-03-29 (Tue))» 編集   RSS 1.0 FEED  

Journal InTime


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

のように、ブロックを使わないといけない。

Tags: Ruby