Вот некоторые другие реализации, которые могут быть полезны. Помещая мультипликаторы в массив, мы можем использовать zip
для соединения элемента во входном массиве с соответствующим значением множителя. Кроме того, это упрощает абстрактную логику, удаляя значения множителя из логики, которая делает умножение (в multiply_arrays
и transform_arrays
).
#!/usr/bin/env ruby
VALUES = [1, 1, 1]
MULTIPLIERS = [600, 800, 1000]
def transform(*values)
values.zip(MULTIPLIERS).map { |x, y| x * y }
end
def multiply_arrays(array1, array2)
array1.zip(array2).map { |n1, n2| n1 * n2 }
end
def transform_arrays(array1, array2, method_name)
array1.zip(array2).map { |n1, n2| n1.public_send(method_name, n2) }
end
p transform(*VALUES) # [600, 800, 1000]
p multiply_arrays(VALUES, MULTIPLIERS) # [600, 800, 1000]
p transform_arrays(VALUES, MULTIPLIERS, :*) # [600, 800, 1000]
Если расчеты должны существенно отличаться (разные операторы, ценности, более сложная логика), чем я бы рассмотреть возможность использования массива лямбды:
def transform_with_lambdas(values, transforms)
values.zip(transforms).map do |value, transform|
transform.(value)
end
end
TRANSFORMS = [
->(x) { x * 600 },
->(x) { x + 100 },
->(x) { x/ 3.0 },
]
p transform_with_lambdas(VALUES, TRANSFORMS) # [600, 101, 0.3333333333333333]
Чувства, подобные вам, усложняют - почему бы не '[a * 600, b * 800, c * 1000]' –
@FrederickCheung, я думаю, что этот комментарий должен быть ответом – Ilya
Что вы ожидаете от ответа на 'calc (5, 8, 15) '? –