2013-10-08 41 views
-1

我有一個.csv從中讀取並解析以創建一個類的實例,我想在從該字符串返回的文本字符串之後命名該類。 .csv中的第一行。 我可以手動創建類,但想讀取行[0]並在此之後命名該變量。Ruby - 基於從.csv讀取的字符串動態命名的變量

例如。例如

CSV.foreach("banks.csv", :headers => true) do |row| 

    ***contents of row[0]*** = Bank.new(row[0], row[1], row[2], row[3], row[4]) 

row [0] ==「Bank_of_America」例如,所以我希望代碼等同於以下內容;

Bank_of_America = Bank.new(row[0], row[1], row[2], row[3], row[4]) 

我已經閱讀了一些使用instance_variable_set的類似主題的其他答覆,但無法獲得給定的代碼工作。

在此先感謝您的任何建議!

編輯:以下工作;

instance_variable_set("@#{row[0]}", Bank.new(row[0], row[1], row[2], row[3], row[4])) 
+1

請問爲什麼要設置每個Bank作爲變量?你有沒有考慮創建一個散列並存儲所有的「銀行」?你打算如何在其他地方引用這些銀行實例? –

+0

是的,另一個.csv是指銀行的名稱,所以「Bank_of_America」字符串將是.eval'd來識別我想在此創建的現有銀行實例。 –

回答

1

你可以做這樣的事情,並動態地創建一個實例變量:

x = 10 
# => 10 
instance_variable_set("@the_number_#{x}", x) 
# => 10 
@the_number_10 
# => 10 

您可以替換"@the_number_#{x}"row[0]現在。

編輯:對不起,我沒有讀到關於實例變量的問題的最後部分。那麼,你的意思是你不能讓他們工作?它是否會出現某種異常或者只是沒有設置正確的值。給我們的代碼不起作用。

+0

'Bank_of_America'不允許作爲實例變量名稱(名稱錯誤) 對不起,嘗試粘貼代碼並且無法使代碼塊格式正常工作。 –

+0

這是因爲你需要在你想要定義的變量前面加一個'@'符號,就像我的例子(這很容易錯過)。所以你會寫'instance_variable_set(「@#{row [0]}」,x)'。 *您是否熟悉字符串插值?* – raf

+0

對不起,我在那裏查了一下,爲自己澄清。該代碼現在創建類的實例,但沒有以row [0]的內容命名,至少不是以我可以通過名稱引用它們的方式,如果我做ObjectSpace.each_object(Bank),我可以打印它們表明它們至少存在。我將不得不嘗試找到一種方法來查看正在發生的事情或他們正在命名的內容,因爲我無法打印它們。感謝你的幫助到目前爲止,我比我更進一步。 –