0

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

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

我到处寻找,但似乎找不到我做错了什么(这可能是一个愚蠢的问题,但它难倒了这个初学者..)我将不胜感激任何帮助!

4

2 回答 2

7

只有一个散列tweet被创建,它的值只是被覆盖了。tweet = {}您应该在循环内分配。

于 2010-10-31T05:07:10.530 回答
2

尤利是对的。多一点解释:

变量是对 ruby​​ 中对象的引用。您的代码正在创建一个单独的哈希对象并使用tweet变量引用它,然后在循环中您为其提供一些值并将其附加到数组中。下次通过循环时,您将在同一个推文对象上设置新值,然后再次附加它。现在,您的数组中的两个项目都使用该新值集引用同一个对象。以此类推,以此类推。最终得到一个包含对同一对象的引用的数组,该对象具有您在循环的最后一次迭代中分配的值。

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

于 2010-10-31T10:41:02.977 回答