使用string.insert时,获取无法修改冻结的字符串

时间:2010-06-14 00:52:03

标签: ruby

这是一个简单的问题。我有以下ruby代码,工作正常。

  def add_zeros number, zeros
    number = number.to_s
    zeros_to_add = zeros - number.length
    zeros_to_add.times do
      number = "0#{number}"
    end
    number
  end

但如果我更换

number = "0#{number}"

使用

number.insert(0, "0")

然后我得到TypeError:无法修改冻结的字符串,有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:1)

如果传递的参数number已经是一个冻结的字符串,那么number = number.to_s将不会改变一个东西,你将无法在适当的位置修改它({{1} }}):

number.insert

当然,从它创建一个新字符串(add_zeros("24".freeze, 10) # => TypeError: can't modify frozen string )不是问题。

你的字符串被冻结的原因很微妙。当你使用字符串作为哈希键时,Ruby会复制它并冻结它:

"0#{number}"

无论如何,作为一般规则,方法不应修改其参数。

在这种情况下,您可能想要使用s = "hello" h = {} h[s] = :world key = h.keys.first key.equal?(s) # => false (Ruby made a copy) key.frozen? # => true (Ruby automatically freezes the copy)

rjust