ruby - 在一个区 block 内产生什么意思?

标签 ruby

  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

多次调用您的 block
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/

相关文章:

ruby - Redis 仅在 < 特定数字时递增?

ruby - 将 radix-2 数字字符串数组写入 Ruby 中的二进制文件

ruby-on-rails - 我如何检查类或 json 对象中的所有属性/值是否为 nil

ruby - 解析文本文件行

html - 如何在ruby中设计自动邮件格式

Ruby Time 比较困惑。一个无法解开的谜团

ruby - 在模块中使用实例变量是一种不好的做法吗?

ruby - 在 if 语句中一起使用 Ruby 的等号 (==) 和或 (||) 运算符的最简洁方法是什么?

ruby - Sql中的多行插入

ruby - Ruby 中的无方法错误