Неопределенная ошибка метода при использовании «yield» и «even?» - PullRequest
0 голосов
/ 22 октября 2018

Когда я пытаюсь вызвать метод с select и num.even? следующим образом,

def selection(array)
  puts "This is inside the method"
  return yield(array)
end

collection = [1,2,3,4,5]
selection(collection.select) { |num| num.even? } 

я получаю неопределенную ошибку метода:

undefined method `even?' for #<Enumerator: [1, 2, 3, 4, 5]:select>  

I'mищет возврат четных чисел в массиве.Я могу получить комбо select even? в других примерах массива.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018
  • Array#select возвращает экземпляр Enumerator, если ему не был передан блок
  • , тогда вы вызываете метод selection, передавая результат вызова collection.select в качестве аргумента и { |num| num.even? } как блок
  • внутри вашей selection функции вы yield аргумент (экземпляр Enumerator) для блока
  • в блоке, который вы вызываете even? в аргументе блока,в результате вы получите сообщение об ошибке.

Я не уверен, что не так с collection.select(&:even?), но если вы захотите повторно внедрить его самостоятельно, вот вам:

def selection(array)
  # convention: return enumerator unless block is given
  return enum_for(:selection) unless block_given?

  enumerator = array.each
  result = []

  loop do
    (value = enumerator.next) rescue return result
    result.push(value) if yield value
  end
end

selection([1,2,3,4,5]) { |num| num.even? }
#⇒ [2, 4]
0 голосов
/ 22 октября 2018

Вы видите эту ошибку, потому что вы передаете объект перечислителя в ваш метод "selection" ... то есть, результатом "collection.select" является Enumerator, и перечислители не реализуют метод "even".

Я полагаю, что вы пытаетесь реализовать собственную версию "select".Следующее является одним из способов достижения вашего заявленного намерения: «Я ищу возврат четных чисел в массиве».

def selection(array)

  results = []
  for item in array do
    results << item if yield item 
  end
  results
end

collection = [1,2,3,4,5]
puts selection(collection) { |num| num.even? }

# => [2,4]

https://mixandgo.com/learn/mastering-ruby-blocks-in-less-than-5-minutes - хорошая ссылка

0 голосов
/ 22 октября 2018

yield (массив) передает весь массив за один ход в блок, данный методу, поэтому он пытается вызвать даже?на массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...