배열이 있습니다. 각 요소에 대해 다른 계산을 수행해야합니다. 나는 다음과 같은 것을 할 수 있다고 생각했습니다.
def calc(a, b, c)
arr = [a, b, c]
arr.map { |i| (i[0] * 600), (i[1] * 800), (i[2] * 1000) }
end
calc(5, 8, 15)
그러나 이것은 작동하지 않습니다. 단일 배열의 각 요소에 대해 다른 계산을 수행하려면 어떻게해야합니까?
다음은 도움이 될 수있는 몇 가지 다른 구현입니다. 승수를 배열에 넣으면 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]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다