2012-10-23 61 views
3

我想在類變量,以填補從一個文件中的類實例,我已經成功的唯一辦法弄清楚如何做到這一點是一樣的東西類方法中的Ruby實例引用?

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 

我唯一的問題已經找到的是,在試圖在一個類的方法來impliment這(在一進入這幾個實例),我不知道如何做到這一點:

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 

即參照實例調用該方法。在這種情況下,自我只會成爲事情,那麼有沒有辦法做到這一點?更合適的做法可能是更好的方式去做這個整體。我昨晚纔剛剛學會了Ruby,所以我沒有機會看到一些更爲巧妙的技巧,而且我的語言成熟度有點新鮮。

對於上下文,Thing是遊戲中的角色,從保存文件中加載它的基本值。

+2

一種更好的方式去了解這將是,國際海事組織,使用YAML和馬歇爾它從一個文件。這裏有一篇關於它的好博客文章http://www.skorks.com/2010/04/serializing-and-deserializing-objects-with-ruby/ – iain

回答

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 
+0

我喜歡它。老實說,我可能最終會用Marshal和YAML來做到這一點,但爲了好奇,儘管如此: instance.instance_variable_set(ivar,val) 這會將類實例替換爲方法嗎?如in,will,a = Thing.new \ n a.method process a.instance_variable_set(ivar,val)或instance.instance_variable _... –

+1

它會運行'a.instance_variable_set'。 –

+0

好的,關於它的一些問題是,所以我去測試它在irb。 這些到處都出現 NameError:未定義的局部變量或方法'實例'爲# 但它給了我一些見解,而不是使用類方法la self.method,我不符合我的範圍,所以通過使用它的一個實例方法,self是實例而不是像我想的那樣的類,如果我選擇這種方式,我甚至可以使用self來拉取正確關聯的文件^^。也許我正在使用不同的版本,但是,洞察力是有價值的 –

相關問題