2017-10-26 7 views
0

私はかなり新しいです。メソッド/メソッド呼び出しをエクスポートすることができるかどうかを知りたがっています。 は基本的に、私はこのている:メソッド呼び出しをファイルにエクスポート

class B 
    def initialize 
    @bptimer = BP_Timer.new("MyName", method(:sayhello)) 
    end 

    def sayhello() 
    msgbox("hello") 
    end 
end 

class BP_Timer 
    def initialize(name = nil, method = nil) 
    @name = name 
    @time = 0 
    @repeats = 0 
    @start_from = 0 
    @method = method 
    @active = false 
    end 

    def start() 
    @active = true 
    $timers.push(self) 
    end 
end 

(Iコードの全てではなく関心のない部分を除去)

基本的に、私は今、後にプッシュされる名前及び方法「BP_Timer」オブジェクトを持っています$ timer配列にファイルに保存し、後でプログラムを再起動するときにロードします。オブジェクトを保存して復元できるようにオブジェクトを分解することは可能ですか?

答えて

0

これは通常、状態を保存/復元する方法ではありません。一般的なアプローチは、コンフィギュレーションを保存して、初期化全体を再度実行することです。

config.yml

:あなたは , JSON`を_YAMLために、あなたのケースで ["MyName", :sayhello]よう 初期化パラメータ、の配列、または任意の他のテキスト形式を格納するためにある、と述べた

プログラム上の

bp_timers: 
    - "MyName": :sayhello 

そして、あなたが起動します。

config = YAML.load_file("config.yml") 
config["bp_timers"].each do |k, v| 
    BP_Timer.new(*[k, method(v)]).start 
end 

あなたの最初の質問に答える:はい、これはある程度はMarshalクラスで可能です。

+0

お返事ありがとうございました!それは確かに私よりも清潔なアプローチのように見えます。私はあなたの答えに小さなフォローアップの質問をすることができますか?私が見るところでは、 "B"オブジェクトへの参照なしに:sayhelloを渡しています。私がそれを読み込むと、クラスbのメソッドsayhelloはどうやって知っていますか?あるいは、メソッド "sayhello"が見つかるまで、すべてのクラスをチェックしますか? – pylon000

+0

いいえ、そうではありません。私はちょうど適切なアプローチがどのように見えるかを共有しました、それは準備ができているスニペットではありません。必要に応じて変更する必要があります。 'B.instance_method(v)'はうまくいくかもしれません。 – mudasobwa

+0

申し訳ありません、ありがとう! – pylon000

関連する問題