Возвращая логическое значение вместо значения, заново создавая метод .select - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь воссоздать метод select, используя цикл while и yield.Ниже мой код:

def my_select(collection)
  count = 0
  newColl = []
  while collection.length > count
    if (collection[count] % 2 == 0)
      newColl.push(yield (collection[count]))
    end
    count += 1
  end
  newColl
end

Когда я запускаю следующее:

arr = [1, 2, 3, 4, 5]
my_select(arr) do |num|
  num.even?
end

Я хочу этот результат:

[2, 4]

, но я получаю это:

[true, true]

Я получаю логическое возвращение вместо фактического значения.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Измените его на:

def my_select(collection)
  count = 0
  newColl = []
  while collection.length > count
    if (collection[count] % 2 == 0)
      result = yield collection[count] # yield first
      newColl.push(collection[count]) if result # then push to newColl if required
    end
    count += 1
  end
  newColl
end

arr = [1, 2, 3, 4, 5]
my_select(arr) {|num| num.even? }
#=> [2,4]

Хотя ваша коллекция newColl здесь в значительной степени бесполезна.

Редактировать : поскольку вы упоминали о воссозданииselect, это может быть альтернативой:

def my_select(collection)
  # it iterates on the collection and filters the item for which the block return true, at the end, I compact the collection to remove nils
  collection.map do |item|
    item if yield(item)
  end.compact
end

# or 
def my_select(collection)
  # start with a blank array
  coll = []
  # iterate on collection
  collection.each do |item|
    # insert all those items for which the block returns true by yield(item)
    coll << item if yield(item)
  end
  # return the array
  coll
end

arr = [1, 2, 3, 4, 5]
my_select(arr) {|num| num.even? }
#=> [2, 4]
0 голосов
/ 17 декабря 2018

Это потому, что вы нажимаете результат yield (который может, но не обязательно должен быть логическим) вместо фактического элемента коллекции.Вы должны добавить элемент на основе того, что возвращает yield, например:

element = collection[count]
newColl.push(element) if yield(element)

Кстати, я не понимаю, почему вы проверяете четность чисел в методе my_select?Это не имеет смысла.

...