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
Комментариев нет:
Отправить комментарий