Если ваш код точно так, как написано, вы определяете и независимый метод find_all
определяется на main
. Когда вы вводите [1,2,3,4].find_all
, вы вызываете метод find_all
на Array
, который определен в методе Enumerable. Таким образом, вы вообще не называете свой метод.
То, что вы, вероятно, пытается сделать это
class Array
def find_all
...
end
end
Таким образом, [1,2,3,4] .find_all будет вызывать этот метод.
Однако обратите внимание, что это, вероятно, плохая идея: вы переопределяете основной метод, который в классе, который не принадлежит вам, так что может иметь последствия в другом коде, который вы не можете предвидеть, если какой-либо другой код использует метод find_all.
Вместо этого вы должны определить метод, который принимает массив в качестве аргумента. Вы можете переместить это модуль, но на данный момент:
def find_all(array)
matching_items = []
array.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
Конечно, это в основном то, что Enumerable#find_all
уже делает, но менее эффективно: так что, возможно, это просто учебное упражнение, в этом случае, большой !, но в противном случае, почему бы просто не использовать существующий метод?
Большое спасибо за разъяснения. Я просто кодировал только для понимания. Использовать Enumerable достаточно –