ruby-on-rails - 在具有 yield 语句的 def 中使用 print

标签 ruby-on-rails ruby ruby-block

我正在尝试在函数内部打印。 该函数用于调用 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   
  } 

最佳答案

如果您的代码与编写的完全一致,那么您正在定义main 上定义的独立方法find_all。当您键入 [1,2,3,4].find_all 时,您正在调用 Array 上的 find_all 方法,该方法在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 已经做的,但效率较低:所以也许这只是一个学术练习,在这种情况下,太好了!但除此之外,为什么不直接使用现有的方法?

关于ruby-on-rails - 在具有 yield 语句的 def 中使用 print,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37040383/

相关文章:

ruby-on-rails - Rails postgres 错误:ActiveRecord::StatementInvalid 异常:PG::AmbiguousColumn:错误:列引用 "sample_id"不明确

css - 在利用 Assets 管道的 Rails 应用程序中,css 文件中背景图像的正确路径是什么?

ruby - 无法使用 bundler 安装 gem

Ruby - 读取 .csv 并从中创建对象

ruby-on-rails - 在 Rails 3.x 应用程序中禁用 Cookie

javascript - ruby on rails - 添加javascript

ruby-on-rails - 如何将 Rails 环境变量放入 apple-app-site-association 文件中以获得通用链接?

ruby-on-rails - Ruby block 作为数组元素用于在 public_send 中展开

ruby - 将 block 传递给映射函数

ruby - 如何在 ruby​​ 中将 with_index 和 with_object 链接到可枚举对象上?