Preencher iterativamente uma matriz com hashes de um bloco de cada/faz me dá todos os valores de repetição ... por exemplo!

StackOverflow https://stackoverflow.com/questions/4061920

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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top