3

ファイルからクラスインスタンスのクラス変数を入力しようとしていますが、これを行う方法を理解できた唯一の方法は次のようなものです

a=Thing.new
File.read("filename.ext").each_line do |arguments| #this will => things like @variable=str\n
eval( "a.instance_eval {" + arguments.chop + "}")   #hence the awkward eval eval chop
end

私が見つけた唯一の問題は、クラスメソッドでこれを実装しようとしている (これを複数のインスタンスに対して実行する) 際に、これを実現する方法がわからないことです。

class Thing
attr_accessor :variable

 def self.method
  File.read("filename.ext").each_line do |arguments|
   eval("instance.instance_eval{" + arguments.chop + "}")   #this line
  end
 end
end

つまり、メソッドを呼び出すインスタンスへの参照です。この場合、self は単に Thing になるだけなので、これを行う方法はありますか? 全体的にこれを行うには、より適切な方法が適している可能性があります。私は昨夜ルビーを学んだばかりなので、必要な巧妙なトリックをいくつか見る機会がありませんでした。その結果、私の言語の成熟度はまだ少し新鮮です。

文脈上、Thing はゲーム内のキャラクターであり、セーブファイルからその基本値をロードします。

4

1 に答える 1

1

まず、マーシャルを見てみましょう。これは、データ構造をシリアライズされた形式にダンプし、それらを再度ロードするために特に使用されます。

とはいえ、自分の方向に固執したい場合は、次のようなことを試してください。

class Thing
  attr_accessor :variable

  def self.method
    File.read("filename.ext").each_line do |arguments|
      ivar, val = arguments.strip.split("=", 2)
      instance.instance_variable_set(ivar, val)
    end
  end
end

#instance_variable_setを使用すると、オブジェクトのインスタンス変数を名前で設定できます。醜い評価は必要ありません!

デモンストレーションとして:

class Foo
  attr_accessor :bar
end

foo = Foo.new
foo.instance_variable_set("@bar", "whatzits")
puts foo.bar # => whatzits
于 2012-10-23T05:43:25.877 に答える