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,那么有什么办法可以做到这一点吗?更相关可能是解决这个问题的更好方法。我昨晚才学了 ruby​​,所以我还没有机会看到一些更巧妙的技巧,因此我的语言成熟度有点新鲜。

就上下文而言,Thing 是游戏中的角色,从保存文件中加载其基本值。

4

1 回答 1

1

好吧,首先,看看Marshal。它专门用于将数据结构转储为序列化格式并重新加载它们。

说,如果你想坚持你的方向,然后尝试这样的事情:

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 回答