2016-05-05 2 views
1

Я пытаюсь напечатать внутри функции. Эта функция используется для вызова блока. Но я не вижу, чтобы печать выполнялась в определении функции. Прошу пролить свет на это. В принципе, я не понимаю, с потоком управления.с использованием печати внутри def с оператором доходности

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 
    } 

ответ

0

Если вы пытаетесь 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"] 
3

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

+0

Большое спасибо за разъяснения. Я просто кодировал только для понимания. Использовать Enumerable достаточно –