1

我正在尝试在函数内部打印。该函数用于调用块。但我没有看到函数定义中发生打印。请对此有所了解。基本上我不清楚控制流程。

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   
  } 
4

2 回答 2

3

如果您的代码与编写的完全一致,则您正在定义和独立的方法find_all定义在main. 当您键入 时[1,2,3,4].find_all,您正在调用find_allon 的方法,该方法在Enumerable方法Array中定义。所以你根本没有调用你的方法。

你可能想要做的是

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已经做的,但效率较低:所以也许这只是一个学术练习,在这种情况下,太好了!但除此之外,为什么不直接使用现有方法呢?

于 2016-05-05T00:49:03.327 回答
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"]
于 2016-05-05T01:30:45.217 回答