加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby中的内核#yield_self,yield(self)和Object

发布时间:2020-12-16 19:27:27 所属栏目:百科 来源:网络整理
导读:Ruby 2.5.0-rc1已经发布并引入了一个新的Kernel#yield_self方法. yield_self,yield(self)和现有的Object#tap方法有什么区别? 解决方法 tap和yield_self之间的区别在于两种方法中的每一种返回的内容. Object#tap为块生成self,然后返回self.内核#yield_self为
Ruby 2.5.0-rc1已经发布并引入了一个新的Kernel#yield_self方法.

yield_self,yield(self)和现有的Object#tap方法有什么区别?

解决方法

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是一个很好看的,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读