Как я могу использовать index или rindex с блоком в Ruby?
-
19-09-2019 - |
Вопрос
Есть ли какой-либо встроенный массив или перечислимый, который позволяет мне искать элемент, используя блок, и возвращать его индекс?
Что - то вроде :
ar = [15,2,33,4,50,69]
indexes = ar.find_indexes {|item| item > 4 == 0}
# indexes will now contain 0,2,4,5
Было бы очень легко добавить свой собственный, но я хотел бы знать, существует ли это уже?
Решение
Я не думаю, что там что-то встроено, по крайней мере, я не заметил ничего ранее незамеченного в Массив или Перечислимый Документы.
Тем не менее, это довольно кратко:
(0..ar.size-1).select { |i| ar[i] > 4 }
Редактировать:Следовало бы упомянуть, что это Ruby 1.8.6.
ЕЩЕ ОДНА ПРАВКА:забыл тройную точку, которая спасает целого персонажа, а также очищает -1
, что меня не устраивало:
(0...ar.size).select { |i| ar[i] > 4 }
Другие советы
Я понимаю, что это всего лишь ruby 1.9
indexes = ar.collect.with_index { |elem, index| index if elem > 4 }.
select { |elem| not elem.nil? }
Редактировать:для ruby 1.8 попробуйте
require 'enumerator'
indexes = ar.to_enum(:each_with_index).
collect { |elem, index| index if elem > 4 }.
select { |elem| not elem.nil? }
Просто позвольте взорваться мощи метода inject!!!;-)
ar.inject([]){|a,i| a.empty? ? a << [0, i] : a << [a.last[0]+1,i]}
.select{|a| a[1] > 4}
.map{|a| a[0]}
(работает с ruby 1.8.6)
Нет, но ты всегда можешь обезьяной залатать это, если захочешь:
class Array
def find_indexes(&block)
(0..size-1).select { |i| block.call(self[i]) }
end
end
ar = [15,2,33,4,50,69]
p ar.find_indexes {|item| item > 4 } #=> [0, 2, 4, 5]
По сути, это ответ Майка Вудхауса, переформатированный, чтобы удалить уродливый диапазон.
ar.each_index.select{|item| item > 4}
Вот версия ответа Джона Энтонибойда, которая работает с Ruby 1.8.7
ar.enum_with_index.each.select{|item| item.first > 4}.map(&:last)