Вам даже не нужно клонировать здесь, вам просто нужно создать новый экземпляр.
Прямо здесь:
test = Http.new({})
test2 = test
у вас нет двух экземпляров Http,у тебя есть.У вас просто есть две переменные, указывающие на один и тот же экземпляр.
Вместо этого вы можете изменить его на это, и у вас не возникнет проблема.
test = Http.new({})
test2 = Http.new({})
Если, однако, вы использовалиАргумент options
shared, вот где вы можете столкнуться с проблемой:
options = { path: nil }
test = Http.new(options)
# options has been mutated, which may be undesirable
puts options[:path] # => "/"
Чтобы избежать этого "побочного эффекта", вы можете изменить метод инициализации, чтобы использовать клон параметров:
def initialize(options)
options = options.clone
# ... do other stuff
end
Вы также можете использовать оператор splat, который немного более загадочный, но, возможно, более идиоматичный:
def initialize(**options)
# do stuff with options, no need to clone
end
Затем вы бы назвали конструктор так:
options = { path: nil }
test = Http.new(**options)
puts test.options[:path] # => "/"
# the original hasn't been mutated
puts options[:path] # => nil