Ruby“如果block_given会产生行?”

时间:2014-02-09 04:03:43

标签: ruby

  # Get our data back
  def queryNewsTable
    @conn.exec( "SELECT * FROM newslib" ) do |result|
      result.each do |row|
        yield row if block_given?
      end
    end
  end

这段代码。我不太明白yield row if block_given?

任何人都可以指出任何有关此问题的好文章,或者你可以简单地向我解释一下 非常感谢

3 个答案:

答案 0 :(得分:7)

这个yield row if block_given?表示可以传递给#queryNewsTable方法(!)的块使用运算符进行计算,换句话说,如果将块传递给函数{ {1}}:

#queryNewsTable

对于queryNewsTable do #some code end 变量中的每一行,您将获得对代码的调用。

注意:对于您的情况,最好优化代码(如果没有使用 ):

result

答案 1 :(得分:3)

问问自己Hash.new的工作原理:

http://www.ruby-doc.org/core-2.1.0/Hash.html#method-c-new

它不需要参数,单个参数或块。如果没有参数,则获取不存在的键的值为nil。如果存在块,则获取不存在的键的值会给出块所指示的内容。显然,它的实现需要一种方式来询问"是否存在阻塞?"这样它就知道要使用哪种行为。这就是block_given?的作用。

http://www.ruby-doc.org/core-2.1.0/Kernel.html#method-i-block_given-3F

对于yield,它只是一种方法,它采用块调用块,并根据需要传递参数。

答案 2 :(得分:2)

当您使用Enumerable#each等功能时,通常会使用{|arg| ... }do ... end传入一个块。第yield row if block_given?行检查是否为此函数调用提供了一个块,如果是,则调用以row作为参数的块。

您可以使用此功能的一种方法是:

queryNewsTable {|row| puts row}

此示例将查询的每一行打印到标准输出,因为为查询结果中的每一行调用执行打印的块。如果没有给出阻止,则该行将被忽略。