Является ли 'buggy_logger' ссылкой на строку 'status' в этом примере Ruby? - PullRequest
1 голос
/ 18 марта 2009

В этом примере запускается ядерное оружие, потому что любые изменения, которые вы вносите в buggy_logger, применяются к строке «status» - так же, как при использовании копии ссылки на объект -> при внесении изменений в копию ссылки, изменение применяется к базовому объекту -> это изменение, в свою очередь, отражается в любых других ссылках на объект. Итак, другими словами, buggy_logger является псевдонимом для объекта «status» без специального использования ключевого слова alias? Это верно? Итак, в рубине вы просто говорите

b = a

и затем любые изменения, которые вы вносите в b впоследствии, также отражаются в a. Или это только так, потому что мы говорим о строках, которые могут изменяться в Ruby?

# example-4.rb

status = "peace"

buggy_logger = status

print "Status: "
print buggy_logger << "\n" # <- This insertion is the bug.

def launch_nukes?(status)
  unless status == 'peace'
    return true
  else
    return false
  end 
end

print "Nukes Launched: #{launch_nukes?(status)}\n"

# => Status: peace
# => Nukes Launched: true

1 Ответ

2 голосов
/ 18 марта 2009

Да, потому что строки - это объекты. Попробуйте

buggy_logger = status.dup

Если вы хотите отдельный объект с тем же начальным значением.

Что касается вашего вопроса о alias Я подозреваю, что вы не правильно понимаете, как alias используется в ruby; он используется в методах, а не в объектах и ​​не связан с изменчивостью.

Обратите внимание, что та же семантика применима к любому классу; если бы статус был массивом, файлом или чем-то еще (если бы он имел изменяемое состояние, пригодное для использования в качестве регистратора), вы бы получили аналогичные результаты.

Одно предупреждение о dup. Если ваш объект ссылается на другие объекты, копия также будет ссылаться на такие же объекты. Это нормально, когда вы начинаете думать об этом правильно, но до тех пор сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...