Попытка использовать .reduce для возврата true, если есть значения true, иначе false, если есть значения false - PullRequest
0 голосов
/ 28 июня 2019

Пытаясь использовать .reduce для урока ... вот что они хотят, чтобы мой метод делал:

  describe "reduce_to_all_true returns true when all values are truthy" do
    it "reduces correctly" do
      source_array = [1, 2, true, "razmatazz"]
      expect(reduce_to_all_true(source_array)).to be_truthy
    end
  end

  describe "reduce_to_all_true returns false when any value is false" do
    it "reduces correctly" do
      source_array = [1, 2, true, "razmatazz", false]
      expect(reduce_to_all_true(source_array)).to be_falsy
    end
  end

Мне трудно понять это ... вот мой код:

def reduce_to_all_true(source_array)
    source_array.reduce { |beTrue| if beTrue == true; p true; else p false end}
end

Я получаю ошибку:

  1) my own reduce-like methods reduce_to_all_true returns true when all valuesare truthy reduces correctly
     Failure/Error: expect(reduce_to_all_true(source_array)).to be_truthy

       expected: truthy value
            got: false

Любая помощь / объяснение будет высоко ценится!

1 Ответ

1 голос
/ 28 июня 2019

Вам нужно понять разницу между «правдивостью» / «ложностью» и бытием true / false.

Ruby оценил бы все, что не nil или false как правдивое, поэтому вы можете написать:

puts 1 if 1

и ставит 1.

В этом задании вас просят использовать правдивость, поэтому вместо сравнения с true вы можете использовать ruby, чтобы выполнить преобразование для вас с использованием двойного отрицания !!:

pry> [1, "2", nil, true, false].map{|e| !!e}
=> [true, true, false, true, false]

Также обратите внимание, что блок в reduce принимает два параметра - один является текущим элементом, а другой аккумулятором - результат взаимодействия с предыдущими элементами. Используйте оба в блоке, иначе вы будете возвращать результат в зависимости только от последнего элемента массива.

...