2010-12-07 37 views
0

J'ai eu cette erreur lors de l'utilisation de la gemme Twitter, et en passant dans un tableau.Que signifie "TypeError: impossible de modifier une chaîne gelée"?

Mon code a l'air assez innocent - je me demande ce qui cause ça?

def twitter_get_users(client, user_names=[]) 
    copy=Array.new(user_names) 
    users = client.users(user_names) 
    end 

TypeError: can't modify frozen string 
    from gems/twitter-1.0.0/lib/twitter/client/utils.rb:10:in `gsub!' 
    from /gems/twitter-1.0.0/lib/twitter/client/utils.rb:10:in `clean_screen_name!' 
    from /gems/twitter-1.0.0/lib/twitter/client/utils.rb:33:in `merge_users_into_options!' 

Répondre

2

Ruby vous permet de freeze objects de sorte qu'ils ne peuvent pas muter. Soit la gemme Twitter a gelé une chaîne, puis a tenté d'appeler le gsub!, ou vous avez passé une chaîne déjà gelée.

Cette réponse ne vous aide pas à résoudre la racine de votre problème, mais elle répond aux questions de «Qu'est-ce que cela signifie et pourquoi cela se produit-il?

+0

merci! C'était intéressant comment l'erreur était dans la façon dont les cordes se sont figées quand ils ont été créés en premier lieu. J'ai essentiellement dupé les chaînes individuelles, et cela a fonctionné. =) –

3

Essayez et voir si elle aide:

def twitter_get_users(client, user_names=[]) 
    client.users user_names.map(&:dup) 
end 
+0

répertoire de ce petit bijou (gems/twitter-1.0.0/) J'ai essayé avant et cela ne fonctionne pas, mais l'équivalent de cela a fonctionné => user_names.map {| u | u.dup} => parce que les chaînes en eux étaient gelées! =) –

+0

C'est intéressant. J'ai mis à jour ma réponse en fonction de votre commentaire. Je pense cependant qu'il y a quelque chose de drôle qui se passe avec le tableau 'user_names' que vous passez. Peut-être devriez-vous utiliser 'dup' quand les chaînes sont ajoutées au tableau (sauf si vous avez besoin de les geler). – bowsersenior

1
  1. Avez-vous essayé d'ouvrir gems/twitter-1.0.0/lib/twitter/client/utils.rb et en regardant à la ligne 10? :-)
  2. si vous ne trouvez pas quelque chose d'évident là-bas, essayez grep -r '.freeze' sur votre projet et rails sur