在Ruby中了解Yield和Yield_Self(完整指南)

Baklib
Baklib 最后一次编辑 大约 4 年前
433
Ruby中的“ yield”一词是什么意思?它到底是做什么的?
好…
Yield是一个关键字(意味着它是语言的核心部分),并且在调用块的方法内部使用。
这是您需要了解的内容:
  1. 调用一个块会在该块内部运行代码(就像调用方法一样)
  2. Yield可以将任意数量的参数传递给块
  3. 块的返回值变为 yield
您必须了解一些障碍才能使之有意义。
您可以将块视为没有名称的方法,这些名称可以作为额外的参数传递给其他方法。
这是一个例子:
  1. def make_salad
  2. 产生“生菜”
  3. 产生“胡萝卜”
  4. 产生“橄榄油”
  5. 结束
  6. make_salad { |成分| 将“在沙拉中添加#{成分}!” }
这将调用该块3次,产生以下输出:
  1. 在沙拉中加入生菜!
  2. 在沙拉中加入胡萝卜!
  3. 在沙拉中加入橄榄油!
本质上就是yield这样做,就像调用方法一样,而是调用块。
我们没有该块的名称,因此此关键字可以解决这个问题。
获取我的终极Ruby秘籍表: 这个方便的7页PDF帮助您快速找到所需的Ruby语法,正在寻找的Ruby方法或您不太记得其名称的内置类。
现在:
让我们研究一下如果您没有通话区会发生什么。

无阻塞产量==错误消息

如果您yield不加障碍地拨打电话,则会收到错误消息
范例:
  1. def write_code
  2. 结束
  3. write_code
  4. #LocalJumpError:未提供任何块(产量)
该错误非常清晰,“未提供块”表示该方法调用write_code未提供块。
如何防止此错误?
像这样:
  1. def write_code
  2. 产量如果block_given ?
  3. 结束
block_given?方法检查一个块是否可用,并且只有yield在确实存在的情况下才允许您这样做。

为什么要使用收益率?

使用yield启用块。
我们使用块来传递代码位,作为方法调用的一部分。
在以下情况下很有用:
  1. 您想编写一个通用的日志记录功能,该功能记录了一段代码运行所需的时间
  2. 您需要在方法完成后运行一些代码(例如Javascript中的“回调”)
  3. 您需要“惰性代码”,即仅在需要时运行并且可由用户自定义的代码(例如,请阅读Hash#fetch方法)
真好!

Yield_Self –有什么区别?

您可能会发现此新yield_self方法,并认为它与有关yield
好吧,不是。
甚至yield(self)不同,因为自我是指当前对象。
在Ruby 2.5yield_self添加的 where 指向我们正在调用该方法的对象。
这种方法的好用吗?
每当您想链接方法并对正在调用的对象执行某些操作时,都可以使用它yield_self
同时返回结果,而不是原始对象。
范例:
  1. n_squared =-> (n ){ n ** 2 }
  2. 2
  3. 。yield_self (&n_squared )
  4. 。yield_self (&n_squared )
  5. #16
在Ruby 2.6中yield_self,该then方法有一个别名。
但不要把它与常规的混淆yield
好?

收益率

我还应该快速提到一下yieldRails和模板引擎的使用
您会发现yield内部布局。
Rails将其替换为您正在渲染的视图的内容。
yield等于空布局!
这样便可以将布局和视图组合在一起。