Ruby - 在 Iterator each 中工作 "yield"

标签 ruby

方法可以使用 Ruby yield 语句调用关联的代码块一次或多次。我们还可以通过在竖线 (|) 中为 yield 提供参数来将值传递给 block 。就像我在下面所做的一样。

  1 def print_name
  2   puts "Hello "
  3   yield "Vikram"
  4 end
  5 
  6 animals = %w( ant bee cat dog elk )
  7 animals.each {|animal| puts animal }
  8 animals.each 
  9 
 10 print_name {|name| puts name}
 11 print_name

在我的代码行中,第 11 行给出了一个错误:

`print_name': no block given (yield) (LocalJumpError)

这意味着我们不能在调用方法时不传递代码块的情况下在方法中使用 yield。

我的问题是,如果 ruby​​ 的“each”方法中存在“yield”语句,那么在我上面的代码“animals.each”(引用第 8 行)中如何工作而不出现任何错误?

如果不存在则

animals.each {|animal| puts animal }

这应该行不通。

最佳答案

Ruby 允许您使用 Kernel#block_given? 检查一个 block 是否被传递给当前方法. Array#each ,如文档所述,如果没有给出 block (使用 block_given? 检查),则返回一个枚举器。

each 不同,您的 print_name 方法会尝试 yield 而不管是否给出 block ,从而导致第 11 行出现错误。

关于Ruby - 在 Iterator each 中工作 "yield",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37241133/

相关文章:

ruby - 为什么 EventMachine 的延迟比 Ruby 线程慢?

Ruby 连接最佳实践

javascript - 从数组中检索列的有效方法是什么?

arrays - 如何根据相邻元素的条件将数组拆分为有限数量的分区

java - JRuby DSL封装,排除标准库

ios - 带有 RubyMotion 的顶部栏 iOS 应用程序?

ruby - rmagick 无法更改字体系列

ruby-on-rails - 如何在邮寄方法的邮寄布局中包含条件?

ruby-on-rails - 了解 routes.rb 中的 "do, end"语法

ruby - 如何使用 mechanize/nokogiri 获得简单但格式化的 html?