在一个街区内收益是什么意思?
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
- 使用Ruby / Mechanize(和Nokogiri)从HTML中提取单个字符串
- 在Ruby中,为什么Array.new(size,object)创建一个由对同一对象的多个引用组成的数组?
- 将Array转换为Hash,同时在Ruby中保留Array索引值
- “file.sync = true”有什么作用?
- var = Watir :: Browser.start’url’之后无法在IRB中使用变量
- 2个用户之间的产品订单
- gmaps4rails和自动完成谷歌API不兼容
- heroku运行rake db:migrate – / bin / sh:1:rake:not found
- 使Ruby程序成为一个守护进程?