解决方法
tap和yield_self之间的区别在于两种方法中的每一种返回的内容.
Object#tap为块生成self,然后返回self.内核#yield_self为块生成self,然后返回块的结果.
以下是一些有用的示例:
龙头
替换方法结尾处对结果行的需求:
def my_method result = get_some_result call_some_method_with result result end
可以写成:
def my_method get_some_result.tap do |result| call_some_method_with result end end
另一个例子是初始化一些对象,需要几个步骤:
some_object = SomeClass.new.tap do |obj| obj.field1 = some_value obj.field2 = other_value end
yield_self和yield(self)
如果在你自己的一个方法中使用,yield_self将与yield(self)具有相同的效果.但是,通过将其作为一种方法,这促进了方法链接作为嵌套函数调用的替代方法.
MichałŁomnicki的This blog post有一些有用的例子.例如这段代码:
CSV.parse(File.read(File.expand_path("data.csv"),__dir__)) .map { |row| row[1].to_i } .sum
可以改写为:
"data.csv" .yield_self { |name| File.expand_path(name,__dir__) } .yield_self { |path| File.read(path) } .yield_self { |body| CSV.parse(body) } .map { |row| row[1].to_i } .sum
这有助于清楚地将嵌套调用用于某些数据的一系列转换.其他编程语言中也存在类似的特征. pipe operator in Elixir是一个很好看的,
原文地址:https://www.jb51.cc/ruby/271061.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。