[#42243] コミュニティと宗教の分離について — Beyond <beyond@...>

14 messages 2006/05/21

[#42267] メニューのループについて — リックス <rubyer4649@...>

りっくすです

21 messages 2006/05/27

[#42301] Re: メニューのループについて — "conundrum /" <conundrum@...>

conundrumです。

11 messages 2006/05/28

[ruby-list:42200] 終了時の状態をPStoreに保存したい

From: 石井 大海 <banzaida@...>
Date: 2006-05-06 02:56:12 UTC
List: ruby-list #42200
こんにちは、konnです。

今、プラグインによって機能を追加できるIRC用のボットエンジ 
ンを作っています。

具体的にどういう仕組みかというと、まずそれぞれのプラグインは 
MyDelクラスを継承し、
なにかメッセージが届いたら、全てを纏める親ボットの、IRCBEx 
クラスから情報を受け取ります。
各MyDelは、@_objに、IRCBExを持っており、知らな 
いメソッドが呼び出されたら
method_missing経由で@_objのメソッドを呼び出しに行く、とい 
う仕組みです。

このとき、各プラグインから@_obj.configでアクセスできるハッ 
シュをつくり、
Botを終了したときに、PStoreでHDにその情報を保存させ 
ようと思っています。

最初、add_finalizerをつかって以下のように実装してみました。

class IRCBEx
   attr_accessor :bots, :config, :db

   def IRCBEx.callback()
     proc {|anid|
     begin
       puts "finalized."
       @db.transaction {|db|
         db[:config] = @config
       }
     rescue
       puts $!,$@
     end
     }
   end

   def initialize(*args)
     @_bots = []
     @db = PStore.new args.fetch(7, "dbs/ircb.db")
     @config = {}
     @db.transaction {|db|
       @db[:config] = {} unless db.root?(:config)
       @config = @db[:config]
     }
     ObjectSpace.define_finalizer(self, IRCBEx.callback)
     super *args[0..6]
   end
end

しかし、これだと上手く動かなかったので、次のように修正してみまし 
た。

def IRCBEx.callback()
     proc {|anid|
     begin
       puts "finalized."
       p anid
       ObjectSpace._id2ref(anid).transaction {|db|
         db[:config] = ObjectSpace._id2ref(anid). config
       }
     rescue
       puts $!,$@
     end
     }
   end
ところが、これだと0x190186 is recycled objectと云われてし 
まって、結局成功しません。

どうすればいいのでしょうか?

もう一度要点を整理すると、
 ・インスタンス内のHashを終了時にHDに保存したい
ということです。

どなたかご存じでしたらお教え下さい。

では……

In This Thread

Prev Next