Hier sind einige andere Implementierungen, die hilfreich sein könnten. Indem wir die Multiplizierer in ein Array setzen, können wir zip
verwenden, um das Element im Eingangsarray mit dem entsprechenden Multiplikatorwert zu verbinden. Außerdem ist es dadurch einfacher, die Logik weiter zu abstrahieren, indem die Multiplikatorwerte aus der Logik entfernt werden, die die Multiplikation ausführt (in multiply_arrays
und 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]
Wenn die Berechnungen wesentlich verschieden sein müssen (verschiedene Operatoren, Werte, komplexere Logik), als ich ein Array von lambdas betrachten würde mit:
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]
Fühlt sich an wie Sie sind komplizierend - warum nicht '[a * 600, b * 800, c * 1000]' –
@FrederickCheung, ich denke dieser Kommentar sollte eine Antwort sein – Ilya
Was erwarten Sie für die Antwort auf 'calc (5, 8, 15) '? –