Итеративное заполнение массива хешами из каждого блока / do дает мне все повторяющиеся значения .. помогите! - PullRequest
0 голосов
/ 31 октября 2010

Я пытаюсь заполнить массив хешей хешами, созданными в каждом цикле. Если я печатаю каждый отдельный хеш в пределах итерации, они различаются, но когда я пытаюсь поместить их в массив, результирующий массив имеет последнийхеш повторяется сколько угодно раз.Вот код:

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 ]

7 голосов
/ 31 октября 2010

Существует только один хеш tweet, когда-либо созданный, и его значения просто перезаписываются.Вы должны назначить tweet = {} внутри цикла.

2 голосов
/ 31 октября 2010

Юлий прав. Еще немного объяснения:

Переменная - это ссылка на объект в ruby. Ваш код создает один хеш-объект и ссылается на него с помощью переменной tweet, затем внутри цикла вы присваиваете ему некоторые значения и добавляете его в массив. В следующий раз при прохождении цикла вы устанавливаете новые значения для этого того же объекта твита и добавляете его снова. Теперь оба элемента в вашем массиве ссылаются на один и тот же объект с этим новым набором значений. И так далее и тому подобное каждый раз. Завершаем массив массивом ссылок на тот же объект, который имеет значения, которые вы присвоили на последней итерации цикла.

Как сказал Юлий, назначение tweet = {} внутри цикла будет каждый раз создавать новый хеш-объект, чего вы и ожидали.

...