2010-12-07 8 views
0

Twitterのgemを使用して配列を渡すときにこのエラーが発生しました。"TypeError:固定文字列を変更できません"とはどういう意味ですか?

私のコードは無邪気に見えます - これを引き起こしているのだろうか?

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!' 

答えて

2

Rubyは、彼らが変異させることがないようにfreeze objectsにことができます。 Twitterのgemが文字列をフリーズしてからgsub!を呼び出しようとしたか、すでにフリーズした文字列を渡したかのいずれかです。

この回答はあなたの問題の根本を解決するのに役立つわけではありませんが、「これはどういう意味ですか、それはなぜ起こったのですか?

+0

ありがとう!文字列が最初に作成されたときに文字列がどのように凍結されたかに誤りがあったのは面白かったです。私は本質的に個々の文字列を二重にし、それはうまくいった。 =) –

3

これを試してみて、それが助けかどうかを確認:

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

私は前にこれを試してみました、これは動作しませんでしたが、同等のこれは働いた=> user_names.map {| u | u.dup} =>それらの文字列がフリーズしていたからです! =) –

+0

それは面白いです。私はあなたのコメントに基づいて私の答えを更新しました。私はあなたが渡している 'user_names'配列で面白いことが起こっていると思います。おそらく、文字列が最初に配列に追加されたときに 'dup'を使うべきです(それらをフリーズさせる理由がない限り)。 – bowsersenior

1
  1. gems/twitter-1.0.0/lib/twitter/client/utils.rbを開き、10行目を見てみましたか? :-)
  2. あなたは、そこに明白な何かを見つけることが、あなたのレールのプロジェクトにgrep -r '.freeze'を試してみて、その宝石のディレクトリにすることができない場合(gems/twitter-1.0.0/
関連する問題