2013-03-31 3 views
1

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 

ответ

1

Ваш код имеет две проблемы:

  1. Проблема сформулирована в несколько расплывчато. Они действительно хотят, чтобы вы вернули false, если какой-либо из элементов не является Fixnums, и true в противном случае - поэтому пустой массив должен дать true. Если вы посмотрите на свой код, вы увидите, что result начинается с false, поэтому, если массив пуст, он вернет false, даже если тест считает, что он должен быть правдой. Вы можете решить это, начав с истины.

  2. Ваш код на самом деле просто определяет, является ли последним элементом массива является Fixnum. Возьмем массив [1, "nope", 3]. Сначала он увидит 1 и установит result в true, затем он увидит «nope» и установит result на false, затем он увидит 3 и установит result в true, и это то, что метод вернет. Тесты RubyMonks на самом деле не обнаруживают эту ошибку, но она появится в реальном мире. Вы хотите вернуться сразу после получения ложного результата, так как этого достаточно, чтобы определить, что массив не все Fixnums.

+0

Спасибо. Это имеет больше смысла. Итак, почему мы даем пустому массиву преимущество сомнений? он, кажется, находится в квантовой неопределенности, это не массив Fixnums, а не массив вещей, которые не являются Fixnums? – cheshirecatalyst

+0

@cheshirecatalyst Это правда, вы могли бы обоснованно утверждать, что там есть как истина, так и ложь. Все, что я могу сказать, это то, что истинным является традиционный дефолт для алгоритмов «все», вероятно, потому, что это наиболее очевидная реализация. (И наоборот, «any?» По умолчанию имеет значение false, предположительно по той же причине.) – Chuck

+0

еще раз спасибо, что дает ясность в вопросе^_ ^ – cheshirecatalyst

0

В этом случае вы никогда не войти в каждый цикл, поскольку нет никаких элементов в array. Таким образом, вы возвращаете значение defualt result, которое вы устанавливаете на false в строке выше. Однако, если в массиве нет элементов, то все его элементы являются Fixnums, поэтому вы должны вернуть true.

+0

Большое спасибо, я обновил код согласно Чаку и ваши ответы – cheshirecatalyst

Смежные вопросы