在一个街区内收益是什么意思?

def any? if block_given? method_missing(:any?) { |*block_args| yield(*block_args) } else !empty? end end 

在ActiveRecord的代码中,块中存在的yield语句的目的是什么?

基本上,如果给当前方法一个代码块(由调用者调用它),则yield执行传递指定参数的代码块。

 [1,2,3,4,5].each { |x| puts x } 

现在{ |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方式,可以接受未知数量的参数作为数组。 调用者可以传入具有不同数量参数的块。

最后让我们看一下块内的收益率。

 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的块的每个元素…

这并不意味着什么特别的。 它只是一个收益率,就像任何其他收益率。

 def test_method ["a", "b", "c"].map {|i| yield(i) } end p test_method {|i| i.upcase } # => ["A", "B", "C"] 

在活动记录的代码片段中,目的是每次产生any?阻止any? 叫做。

这有助于我理解: yield是一种将块插入到您已编写的方法中的方法,这意味着“在此处执行”。 例如,

没有参数

 def original_method puts "a" puts "b" end 

如果你想在这两个p之间执行一些未知的块怎么办?

 def updated_method puts "a" yield puts "b" end # these two are the same: updated_method { puts "execute something here" } updated_method do puts "execute something here" end 

结果将是

 a execute something here b 

您可以根据需要在方法中获得尽可能多的yield

带参数

 def updated_method puts "a" yield puts "b" end 

如果你想在字符串"Execute something on me!"上执行一些未知块,该怎么办"Execute something on me!"

 def updated_method_with_argument puts "a" yield("Execute something on me!") puts "b" end updated_method_with_argument do |argument| puts "This argument gets put out: " << argument end 

结果将是

 a This argument gets put out: Execute something on me! b