Я знаю, что это ответ, основанный на моем мнении, но я предпочитаю "отлавливать" аргументы в ruby (не прибегая к .dup
или подобным), это передавать их функции, которая передает аргументы лямбда, которая оценивается на месте:
def argument_trap(*args)
lambda { args }.call
end
def array_of_three(a, b, c)
a, b, c = argument_trap(a, b, c)
a += 1
b -= 1
c *= 2
[a, b, c]
end
def array_of_n(*args)
args = argument_trap(*args)
args.map { |arg| arg += arg }
end
a, b, c, d, e, f = 1, 2, 3, 4, 5, 6
three = array_of_three(a, b, c)
n = array_of_n(a, b, c, d, e, f)
p [a, b, c]
p three
puts
p [a, b, c, d, e, f]
p n
Придает
[1, 2, 3]
[2, 1, 6]
[1, 2, 3, 4, 5, 6]
[2, 4, 6, 8, 10, 12]
Демо-версия здесь
С этим шаблоном в первой строке тела функции ясно, что имена аргументов теперь указывают на клоны. Но опять же, это вопрос предпочтений - мне нравится сохранять исходные имена аргументов вместо того, чтобы называть их dupA
или что-то в этом роде, поскольку для меня ясно, что в этих функциях я сейчас работаю над дубликатами.
Это также мешает функциям выполнять обе: работу со ссылками на исходное значение и с дубликатами, что, на мой взгляд, является преимуществом, поскольку выполнение обоих может привести к путанице в коде. С другой стороны, можно забыть один или два аргумента, и он снова в аду кодирования.