def any?
if block_given?
method_missing(:any?) { |*block_args| yield(*block_args) }
else
!empty?
end
end
在 ActiveRecord 的这段代码中,存在于 block 中的 yield 语句的目的是什么?
最佳答案
基本上,如果当前方法已被赋予一个代码块(由调用者,在调用它时),yield
会执行传入指定参数的代码块。
[1,2,3,4,5].each { |x| puts x }
现在 { |x| puts x}
是传递给 Array
的每个方法的代码块(x
是一个参数)。 Array#each
实现将迭代自身并使用 x = each_element
pseudocode
def each
#iterate over yourself
yield( current_element )
end
由此产生
1
2
3
4
5
*block_args
是一种接受未知数量参数作为数组的 Ruby 方法。调用者可以传入具有不同数量参数的 block 。
最后让我们看看 yield within a block 的作用。
class MyClass
def print_table(array, &block)
array.each{|x| yield x}
end
end
MyClass.new.print_table( [1,2,3,4,5] ) { |array_element|
10.times{|i| puts "#{i} x #{array_element} = #{i*array_element}" }
puts "-----END OF TABLE----"
}
此处 Array#each
将每个元素生成给 MyClass#print_table
的 block ...
关于ruby - 在一个区 block 内产生什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1419780/