Preencher iterativamente uma matriz com hashes de um bloco de cada/faz me dá todos os valores de repetição ... por exemplo!
Pergunta
Estou tentando preencher uma variedade de hashes com hashes criados através de um loop, se imprimir cada hash individual dentro da iteração, eles são distintos, mas quando tento empurrá -los para uma matriz, a matriz resultante tem o último hash repetindo o que número de vezes. Aqui está o código:
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
Eu olhei em todos os lugares, mas não consigo encontrar o que estou fazendo de errado (provavelmente é um problema idiota, mas está tocando esse iniciante ..) vou agradecer qualquer ajuda!
Solução
Existe apenas um hash tweet
já criado, e seus valores são apenas substituídos. Você deve atribuir tweet = {}
dentro do loop.
Outras dicas
Yuliy está certo. Um pouco mais de explicação:
Uma variável é uma referência a um objeto em Ruby. Seu código está criando um único objeto de hash e referenciando -o com o tweet
Variável, em seguida, dentro do loop, você está dando alguns valores e anexando -o à matriz. Na próxima vez que o loop, você estará definindo novos valores nisso mesmo objeto de tweet e anexá -lo novamente. Agora, os dois itens da sua matriz estão referenciando o mesmo objeto com esse novo conjunto de valores. E assim por diante e assim por diante. Acabando com uma matriz cheia de referências ao mesmo objeto, que tem os valores que você atribuiu na última iteração através do loop.
Como Yuliy disse, atribuindo tweet = {}
Dentro do loop criará um novo O objeto de hash cada vez, que é o que você espera.