这是一个简单的问题。我有以下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:无法修改冻结的字符串,有谁知道为什么会这样?
答案 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