Используя 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 уже делает, но менее эффективно: так что, возможно, это просто академическое упражнение, в таком случае, здорово!, но в противном случае, почему бы просто не использовать существующий метод?

Другие вопросы по тегам