使用带有yield语句的def里面的print

时间:2016-05-05 00:33:08

标签: ruby-on-rails ruby ruby-block

我正在尝试在函数内打印。 该函数用于调用块。 但我没有看到函数定义中发生的打印。 请详细说明一下。基本上我不清楚控制流程。

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 个答案:

答案 0 :(得分:3)

如果您的代码与编写完全相同,那么您就是SELECT c.custname FROM Customer c LEFT JOIN Service s ON c.custname = s.custname WHERE s.custname IS NULL UNION ALL SELECT a.agentname FROM Agent a LEFT JOIN Service s ON a.agentname = s.agentname WHERE s.agentname IS NULL 上定义的独立方法find_all。当您输入main时,您在[1,2,3,4].find_all上调用find_all方法,该方法在Enumerable方法中定义。所以你根本就没有打电话给你的方法。

你可能要做的是

Array

这样,[1,2,3,4] .find_all将调用此方法。

但是,请注意,这可能是一个坏主意:您正在覆盖不属于您的类中的核心方法,因此可能会导致其他代码无法预测任何其他代码的后果使用find_all方法。

您可能尝试的是定义一个将数组作为参数的方法。您可以将其移至模块,但目前:

class Array
  def find_all
    ...
  end
end

当然,这基本上是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 已经做的,但效率较低:所以也许这只是一个学术练习,在这种情况下,很棒!,但除此之外,为什么不使用现有的方法? / p>

答案 1 :(得分: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"]