instance_eval in Tumblr::API.write()

どうもインスタンス変数をTumblr::API.write() のブロック部で使ってもうまく参照できてないと思ったら、write() 内で渡されたブロックを writer オブジェクトで instance_eval してるからっぽい。

class Img
  ..
  def post
    Tumblr::API.write(email, passwd) do 
      photo(@uri, @comment)   # @uri, @comment は Img クラスのインスタンス変数
    end
  end
  ..
end

とした時、@uri, @comment がブロック内で期待どおりに評価されていない( nil になってる)。

tumblr.rb を見ると、

    def self.write(email, password, generator="ruby-tumblr", &b)
      Net::HTTP.start("www.tumblr.com") do |http|
        writer = Writer.new(http, email, password, generator)
        writer.instance_eval &b
      end
    end

、、、うーん、、、スコープが writer オブジェクトになっちゃうから、Imgオブジェクトのインスタンスは参照できなくなっちゃうのかな?とりあえずローカル変数に直して渡してあげることで対処。