迭代地从每个/ do块中使用哈希填充数组,这给了我所有的重复值。帮助!

时间:2010-10-31 05:03:41

标签: ruby arrays hash iteration block

我正在尝试使用通过每个循环创建的哈希来填充哈希数组,如果我在迭代中打印每个单独的哈希它们是不同的,但是当我尝试将它们推送到数组时,结果数组具有最后一个哈希重复了很多次。这是代码:

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

我到处寻找,但我似乎无法找到我做错的事情(这可能是一个愚蠢的问题,但是这对初学者来说很难......)我会感激任何帮助!

2 个答案:

答案 0 :(得分:7)

只创建了一个哈希tweet,其值只是被覆盖。您应该在循环中指定tweet = {}

答案 1 :(得分:2)

Yuliy是对的。更多解释:

变量是对ruby中对象的引用。你的代码是创建一个哈希对象并用tweet变量引用它,然后在循环内你给它一些值并将它附加到数组。下次循环时,您将在相同的推文对象上设置新值,然后再次附加。现在,数组中的两个项都引用了具有该新值集的同一对象。等等每次都是等等。结束一个充满对同一对象的引用的数组,该对象具有在循环的最后一次迭代中分配的值。

正如Yuliy所说,在循环中分配tweet = {}每次都会创建一个 new 哈希对象,这正是您所期望的。