Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Использование итераторов для проверки элементов массива

#ruby #итераторы


def isfin?
  @matrix[0..@col_count-1][0]==0
end


Как пользоваться итераторами в Ruby? Например, нужно вернуть true, если все элементы
массива [n][0] (где n от 0 до "длина массива - 1") равны нулю. Или в данном случае
лучше использовать простой цикл?

Например, если у нас будет 0..200, и на второй позиции уже не 0, то можно выйти с
false и не просматривать остальные элементы. Или при использовании итераторов это условие
будет автоматически учтено, и медленнее работать не будет?
    


Ответы

Ответ 1



Во-первых, судя по собаке, речь идет о методе собственного класса. Я бы рекомендовал не воротить никакого ООП, пока не знаешь сам язык и stdlib. def isfin? @matrix.all? do |row| row[0] == 0 end end Итератор all? здесь обрывается и возвращает false как только блок do end вернет false. Можно переписать это таким образом, что матрицу сначала транспонируем, и проверяем лишь одномерный массив: def isfin? @matrix.transpose.first.all? do |cell| cell == 0 end end И тогда использование стандартного метода .zero? позволяет записать это короче: def isfin? @matrix.transpose.first.all? &:zero? end А можно .map вместо .tranpose использовать -- это может работать быстрей: def isfin? @matrix.map(&:first).all? &:zero? end

Комментариев нет:

Отправить комментарий