http://rubymonk.com/learning/books/1/problems/148-array_of_fixnumrubymonk "все элементы в массиве Fixnum"?
Рубин монах говорит:
def array_of_fixnums?(array)
array.all? { |x| x.is_a? Fixnum }
end
Это нормально и все, однако следующий код работает в IRB 1.9.2, но терпит неудачу, когда rubymonk проходит пустой массив:
def array_of_fixnums?(array)
result = false
array.each { |n|
if n.is_a? Fixnum
result = true
else
result = false
end }
result
end
здесь находится выходной сигнал irb:
1.9.2-p320 :001 > array_of_fixnums? []
=> false
и вот что rubymonk говорит о своем решении:
returns 'true' for [1,2,3] ✔
returns 'false' for ['a',1,:b] ✔
returns 'true' for []
RSpec::Expectations::ExpectationNotMetError
expected false to be true
Я задаюсь вопросом, почему это так?
Обновление на основе ответов:
def array_of_fixnums?(array)
result = true
array.each { |n| return false unless n.is_a? Fixnum }
result
end
Спасибо. Это имеет больше смысла. Итак, почему мы даем пустому массиву преимущество сомнений? он, кажется, находится в квантовой неопределенности, это не массив Fixnums, а не массив вещей, которые не являются Fixnums? – cheshirecatalyst
@cheshirecatalyst Это правда, вы могли бы обоснованно утверждать, что там есть как истина, так и ложь. Все, что я могу сказать, это то, что истинным является традиционный дефолт для алгоритмов «все», вероятно, потому, что это наиболее очевидная реализация. (И наоборот, «any?» По умолчанию имеет значение false, предположительно по той же причине.) – Chuck
еще раз спасибо, что дает ясность в вопросе^_ ^ – cheshirecatalyst