2015-04-28 14 views
0

我看到了這個問題的幾個變種,但沒有真正找到一個堅實的答案。所以我有一個URLS數組。我想遍歷該數組,併爲每個單獨的URL,我將創建一個WebPages類的實例。如何通過一個循環並用每次迭代Ruby創建一個新對象?

因此,如果數組URL有5個URL,那麼我會創建WebPages的5個對象。我試圖使用eval()來做到這一點,但很快就瞭解到由eval創建的實例具有非常本地的作用域,並且之後我無法使用這些WebPage對象。

string_to_eval = @urls.map{|x| "webpage#{urls.index(x)} = WebPage.new('# {x}')"}.join(';') 
puts string_to_eval 
eval(string_to_eval) 

String_to_eval打印出:

webpage0 = WebPage.new('http://www.google.com'); 
webpage1 = WebPage.new('http://www.yahoo.com'); 
webpage2 = WebPage.new('http://www.amazon.com'); 
webpage3 = WebPage.new('http://www.ebay.com') 

我還能怎麼做與Ruby中循環的每次迭代的對象?有沒有解決的辦法?

回答

5

爲什麼不是這樣?

webpages = @urls.map { |url| WebPage.new(url) } 

它通常是一個壞主意,有webpage0webpage1 ......當你可以有webpages[0]webpages[1] ...(而且,陣列的方式並不需要的eval邪惡的。)

2

在這種情況下,我會放棄獨特的變量名稱,而只是將結果對象留在數組中。在這種情況下,代碼將如下所示:

>> @urls.map{|url| WebPage.new(url)} 
=> [WebPage('http://www.google.com'), WebPage('http://www.yahoo.com'), WebPage('http://www.amazon.com'), WebPage('http://www.ebay.com') ] 
相關問題