“TypeError:无法修改冻结字符串”是什么意思?

时间:2010-12-07 23:31:04

标签: ruby-on-rails ruby rubygems

使用Twitter gem并传入数组时出现此错误。

我的代码看起来很无辜 - 想知道造成这种情况的原因是什么?

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

3 个答案:

答案 0 :(得分:3)

试试这个,看看是否有帮助:

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

答案 1 :(得分:2)

Ruby允许你freeze objects,以便它们不会被改变。 Twitter的宝石冻结了一个字符串,然后尝试在其上调用gsub!,或者你传入了已经冻结的字符串。

这个答案并不能帮助您解决问题的根源,但它确实回答了“这意味着什么以及为什么会发生这种情况?”的问题。

答案 2 :(得分:1)

  1. 您是否尝试过开放gems/twitter-1.0.0/lib/twitter/client/utils.rb并查看第10行? : - )
  2. 如果你在那里找不到任何明显的东西,请在你的rails项目和那个gem的目录(grep -r '.freeze'
  3. 上尝试gems/twitter-1.0.0/