dup
клонирует объект. Когда вы передаете объект методу, все, что изменяет внутреннее состояние этого объекта, будет отражено в области вызова. Например, попробуйте этот код:
def replace_two(options)
options[:two] = "hi there"
end
options = { one: "foo", two: "bar" }
replace_two(options)
puts options[:two]
Это будет печатать hi there
, потому что replace_two()
модифицировали содержимое хэш.
Если вы хотите, чтобы избежать изменений переданного в options
, вы можете позвонить .dup
на него, а затем какие-либо изменения, внесенные в клон не будут отражены в вызывающей сфере:
def replace_two(options)
options = options.dup
options[:two] = "hi there"
end
options = { one: "foo", two: "bar" }
replace_two(options)
puts options[:two]
напечатает bar
. Это общий шаблон, который следует за Principle of Least Astonishment. В Ruby методы, которые изменяют свои аргументы, обычно называются суффиксом !
, чтобы предупредить пользователя о том, что они являются разрушительными/изменяющими действиями. Версия метода не dup
должна была называться replace_two!
для указания этого побочного эффекта.
Кажется, что ни один поиск не сделал, прежде чем задавать этот вопрос. Вы всегда должны попытаться получить ответ самостоятельно, и если вы не найдете ответа, тогда вы должны спросить о stackoverflow. – KULKING
Я искал, и я не нашел ответ. Вот почему я спрашиваю здесь – Georgi
Это разумный вопрос, который несправедливо отмечен из-за того, что авторы используют английский как второй язык. Отредактировано для ясности и проголосовало. Пожалуйста, постарайся быть немного более дружелюбными людьми, мы рубисты. – superluminary