# 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?
任何人都可以指出任何有关此问题的好文章,或者你可以简单地向我解释一下 非常感谢
答案 0 :(得分:7)
这个yield row if block_given?
表示可以传递给#queryNewsTable
方法(!)的块使用yield运算符进行计算,换句话说,如果将块传递给函数{ {1}}:
#queryNewsTable
对于queryNewsTable do
#some code
end
变量中的每一行,您将获得对代码的调用。
注意:对于您的情况,最好优化代码(如果没有使用db trigger):
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}
此示例将查询的每一行打印到标准输出,因为为查询结果中的每一行调用执行打印的块。如果没有给出阻止,则该行将被忽略。