Получение не может изменить замороженную строку при использовании string.insert - PullRequest
1 голос
/ 14 июня 2010

Это быстрый вопрос.У меня есть следующий код 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: canизменить замороженную строку, кто-нибудь знает, почему это?

1 Ответ

1 голос
/ 14 июня 2010

Если переданный аргумент number уже является замороженной строкой для начала, то number = number.to_s ничего не изменит и вы не сможете изменить ее на месте (с number.insert):

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

Создание новой строки из нее ("0#{number}"), конечно, не проблема.

Причина, по которой ваша строка заморожена, неуловима. Когда вы используете строку в качестве хеш-ключа, Ruby сделает ее копию и заморозит:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...