Страницы

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

суббота, 9 марта 2019 г.

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

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


Ответ

Во-первых, судя по собаке, речь идет о методе собственного класса. Я бы рекомендовал не воротить никакого ООП, пока не знаешь сам язык и 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

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

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