我正在尝试使用通过每个循环创建的哈希来填充哈希数组,如果我在迭代中打印每个单独的哈希它们是不同的,但是当我尝试将它们推送到数组时,结果数组具有最后一个哈希重复了很多次。这是代码:
def get_tweets
tweet_array = Array.new
tweet = {}
Twitter::Search.new('Accidente' || 'accidente').from('sttmed').each do |r|
tweet["texto"] = r.text
tweet["reportado"] = (Time.parse(r.created_at)).localtime.strftime("%B %d, %H:%M %p %Z")
tweet["direccion"] = r.text.scan(/\w*_\w*/).join
tweet_array << tweet
end
return tweet_array # RETURNS ALL REPEAT VALUES!!
end
我到处寻找,但我似乎无法找到我做错的事情(这可能是一个愚蠢的问题,但是这对初学者来说很难......)我会感激任何帮助!
答案 0 :(得分:7)
只创建了一个哈希tweet
,其值只是被覆盖。您应该在循环中指定tweet = {}
。
答案 1 :(得分:2)
Yuliy是对的。更多解释:
变量是对ruby中对象的引用。你的代码是创建一个哈希对象并用tweet
变量引用它,然后在循环内你给它一些值并将它附加到数组。下次循环时,您将在相同的推文对象上设置新值,然后再次附加。现在,数组中的两个项都引用了具有该新值集的同一对象。等等每次都是等等。结束一个充满对同一对象的引用的数组,该对象具有在循环的最后一次迭代中分配的值。
正如Yuliy所说,在循环中分配tweet = {}
每次都会创建一个 new 哈希对象,这正是您所期望的。