Используя print внутри def с оператором yield
Я пытаюсь распечатать внутри функции. Функция используется для вызова блока. Но я не вижу печати в определении функции. Пожалуйста, пролить свет на это. В принципе, я не понимаю, с потоком управления.
def find_all
matching_items = []
self.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
p ['a', 'b','c','c'].find_all { |item|
if item == 'a'
true
end
}
2 ответа
Если вы пытаетесь re-open
класс Array
тогда, как вы можете это сделать
class Array
def find_all(matching_items = [])
self.each do |item|
if yield(item)
puts "after yield" #print not happening
matching_items << item
end
end
matching_items
end
end
p ['a', 'b', 'c', 'c'].find_all { |item|
if item == 'a'
true
end
}
Выход
after yield
["a"]
Если ваш код точно такой, как написано, вы определяющий и независимый метод 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
уже делает, но менее эффективно: так что, возможно, это просто академическое упражнение, в таком случае, здорово!, но в противном случае, почему бы просто не использовать существующий метод?