Ruby 在一个街区内屈服意味着什么?
在ActiveRecord中的这段代码中,存在于块中的yield语句的用途是什么?基本上,如果当前方法已被赋予一个代码块(由调用方调用),则Ruby 在一个街区内屈服意味着什么?,ruby,Ruby,在ActiveRecord中的这段代码中,存在于块中的yield语句的用途是什么?基本上,如果当前方法已被赋予一个代码块(由调用方调用),则yield执行传入指定参数的代码块 def any? if block_given? method_missing(:any?) { |*block_args| yield(*block_args) } else !empty? end end 现在,{x | put x}是传递给数组的每个方法的代码
yield
执行传入指定参数的代码块
def any?
if block_given?
method_missing(:any?) { |*block_args| yield(*block_args) }
else
!empty?
end
end
现在,{x | put x}
是传递给数组
的每个方法的代码块(x
是一个参数)。Array#每个
实现都会迭代自身,并使用x=each_元素多次调用您的块
[1,2,3,4,5].each { |x| puts x }
因此,它的结果
pseudocode
def each
#iterate over yourself
yield( current_element )
end
*block_args
是一种Ruby方式,用于接受未知数量的参数作为数组。调用方可以传入具有不同数量参数的块
最后,让我们看看区块内的收益率
1
2
3
4
5
在这里,
Array#每个
将每个元素生成给MyClass#print_table
的块它并不意味着任何特殊的内容。这只是一个收益率,就像其他收益率一样
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----"
}
在active record的代码片段中,目的是每次调用
any?
的块时都要生成。这有助于我理解:yield
是一种将块插入到您已经编写的方法中的方法,这意味着“在此处执行某些东西”。比如说,
无参数
如果要在这两个p
之间执行某个未知块,该怎么办
def original_method
puts "a"
puts "b"
end
结果将是
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
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
在一个方法中,您可以有任意多个yield
s
带参数
如果要在字符串“在我身上执行某物!”
上执行某个未知块,该怎么办
这有助于记住,块包括周围方法的范围,因此它实际上与在其他任何地方产生完全相同。
yield
无论如何都不关心范围。
a
execute something here
b
def updated_method
puts "a"
yield
puts "b"
end
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