2010-06-14 50 views
1

這是一個簡單的問題。我有下面的ruby代碼,它工作正常。使用string.insert時不能修改凍結的字符串

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") 

然後我得到的類型錯誤:不能修改凍結字符串,沒有人知道這是爲什麼?

+1

您正在使用什麼版本的Ruby的?我無法在OSX的1.8.6,1.8.7或1.9.2中重現該錯誤。這對我來說可以。另一種解決方法是:是否有其他可能影響'number'狀態的代碼? – Telemachus 2010-06-14 01:17:24

+0

感謝您的回覆,我在mac os上使用ruby 1.8.7,當我在測試中使用ruby 1.8.7時會出現此錯誤 def test_zeros {「43544」=>「43544」,「344」=>「00344」, 5 =>「00005」,100 =>「00100」} each_pair do | input,expected | 串= @ bs.add_zeros(輸入,5) assert_equal(string.class,字符串) assert_equal(字符串,預期的, 「應該是#{預期}但是爲#{串}」) 端 端 其中我把它從經營一類內與@bs實例 歡呼 理查德 – Richard 2010-06-14 05:48:26

回答

1

如果傳遞的參數number已經凍結字符串開始,然後number = number.to_s不會改變任何事情,你將無法對其進行修改到位(與number.insert):

add_zeros("24".freeze, 10) # => TypeError: can't modify frozen string 

從中創建一個新的字符串("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

24.to_s.rjust(10, "0") # => "0000000024" 
+0

謝謝您的回答, 我不知道,我是路過它的字符串是一個字符串凍結(但現在我想起來了,作爲參數傳入的字符串會自動被認爲是「凍結」??)。我想我可能需要更多地瞭解這個!我想爲整數通過時的情況添加number.to_s,儘管有時它可能是一個字符串。 但我會看看更多關於凍結字符串的信息,非常感謝您對此提供的建議。 還要感謝rjust上的提示,這非常有幫助,我將用它來代替! – Richard 2010-06-14 06:01:30

+0

啊,對了,我忘了說爲什麼你的字符串首先被凍結了。檢查我更新的答案。 – 2010-06-14 15:36:11

相關問題