gpt4 book ai didi

ruby - Ruby 中 Kernel#yield_self、yield(self)、Kernel#then 和 Object#tap 之间的区别?

转载 作者:数据小太阳 更新时间:2023-10-29 06:37:13 24 4
gpt4 key购买 nike

Ruby 2.5 引入了#yield_self 方法。Ruby 2.6 引入了#then 方法。

yield_selfyield(self)then和现有的Object#tap有什么区别方法?

最佳答案

tap之间的区别和 yield_self在这两种方法返回的内容中。

Object#tap 将 self 生成到 block ,然后返回 selfKernel#yield_self 将自身交给 block ,然后返回 block 的结果

这里有一些例子,说明每个例子都有用:

点击

替换方法末尾对 result 行的需要:

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) 相同的效果。但是,通过将其本身作为一种方法,这促进了方法链作为嵌套函数调用的替代方法。

This blog post Michał Łomnicki 着有一些有用的例子。例如这段代码:

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值得一看。

然后

#yield_self 可能感觉有点技术性和冗长。这就是为什么 Ruby 2.6 为 #yield_self#then 引入了一个别名。

"something"
.then {|str| str.chars.map {|x| x.ord + 1 }}
.then {|ords| ords.map {|x| x.chr }}
.then {|chars| chars.join }
.then {|str| str + "!" }
.then {|str| str + "!" }
# tpnfuijoh!!

关于ruby - Ruby 中 Kernel#yield_self、yield(self)、Kernel#then 和 Object#tap 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47890598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com