【问题标题】:Ruby - can't modify frozen string (TypeError)Ruby - 无法修改冻结的字符串 (TypeError)
【发布时间】:2010-02-05 03:56:00
【问题描述】:

得到

...'[]=': 无法修改冻结字符串 (TypeError)

在尝试修改我认为是 ARGV[0] 的副本时。

每个结果都相同

arg = ARGV[ 0 ]
arg_cloned = ARGV[ 0 ].clone
arg_to_s = ARGV[ 0 ].to_s

arg[ 'x' ] = 'y'
arg_cloned[ 'x' ] = 'y'
arg_to_s[ 'x' ] = 'y'

【问题讨论】:

  • ARGV 带有处于冻结状态的字符串 ARGV.map(&:dup) 将返回一个具有相同非冻结字符串的数组。

标签: ruby


【解决方案1】:

因为谷歌花了太长时间才找到正确的答案......

需要做的

arg_dup = ARGV[ 0 ].dup

【讨论】:

  • 对。克隆复制对象的整个状态,包括冻结状态。 Dup 复制没有其他标志的对象的肉。
  • 对 .to_s 的作用相同(包括冻结)感到非常惊讶!?
  • 从发布您的问题到搜索 Google 需要 64 秒,然后因为太长而对发布您的答案感到恼火? :)
  • 远不止这些......做了很多谷歌搜索,这需要很长时间才能找到正确的结果。然后我发布了这个问题和答案,所以“堆栈”有了它,现在很容易找到(当我忘记的时候)。现在在谷歌排名第一!
  • 在 2.1.0 中,Object#dup 不会复制冻结状态。
【解决方案2】:

由于 Ruby 2.3 推荐的方法是 use the unary plus operator,如果字符串被冻结,它将返回一个重复的可变字符串。

+arg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2016-03-26
    • 1970-01-01
    • 2013-10-04
    • 2011-11-04
    相关资源
    最近更新 更多