Я подумал, что этот ответ уже задавался, поэтому я искал, но ничего не смог найти. Конечно, есть множество вопросов по Ruby Array, так что они могут быть там, просто похоронены.
В любом случае я пытаюсь уменьшить перекрестное произведение диапазонов, возвращая сумму всех элементов перекрестного произведения, которые удовлетворяют некоторому набору условий. Для построения тривиального примера, если у меня есть такой массив:
[0..1,0..1,0..1]
Я бы хотел перебрать этот набор:
[
[0,0,0],
[0,0,1],
[0,1,0],
[0,1,1],
[1,0,0],
[1,0,1],
[1,1,0],
[1,1,1]
]
и вернуть сумму на основе условия «return 1 if i[0] == 1 and i[2] == 0
» (что даст 2). В моем надуманном примере я мог бы сделать это так:
br = 0..1
br.reduce(0){|sumx, x|
sumx + br.reduce(0){|sumy, y|
sumy + br.reduce(0){|sumz, z|
sumz + (x == 1 and z == 0 ? 1 : 0)
}
}
}
, но в реальном приложении набор диапазонов может быть намного больше, и вложение сокращается таким образом, что будет довольно уродливо. Есть ли лучший способ?