gpt4 book ai didi

ruby - 关于注入(inject)方法: How does it work?

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

这部分代码计算每个算术系列的值,直到并包括用户输入的数字:

print "enter a number: "
num = gets.to_i
(1..num).inject(0) do |res, e|
res += e
p res
end

我认为 (1..num) 是范围,num 是用户输入。我知道 inject 通过应用由 block 指定的二元运算或命名方法或运算符的符号来组合枚举的所有元素。

我不明白这一行中每个元素的作用:

(1..num).inject(0) do |res, e|
  • |res, e| 是什么意思?它必须是定义 inject 做什么的 block ,但是例如 rese 代表什么? (e 可能是元素?)
  • (0) 代表什么?
  • 命令做什么做什么?
  • 它与 (1..num)inject(0) 有什么联系?
  • 我假设末尾的 p 仅代表 putsprint 是否正确?

最佳答案

inject 采用可选的起始值,以及采用中间值和元素并返回新中间值的 block 。

所以:

What does (0) stand for?

注入(inject)的起始值参数。

What does the command "do" do?

这不是命令;它标志着 block 的开始(由 end 终止)。 .inject(0) do ... end 几乎(除了一些语法问题)与 .inject(0) { ... } 相同。通常,do ... end 用于多行 block ,{ ... } 用于单行 block ,但这不是规则。

What does |res, e| mean?

这些是 block 参数(中间值和当前元素),这里可能分别以“结果”和“元素”命名。

让我们看一个简化的例子:(1..3).inject(0) do |res, e| res + e end 会将中间结果设置为 0。然后它将传递这个中间结果和被注入(inject)的可枚举的第一个元素:res0e1。 block 的值是其最后一个表达式的值,即 1(0 + 1 的结果)。此 1 现在成为新的中间值,而 2 成为下一个当前元素。该 block 的值为 3(1 + 2 的结果)。在下一次迭代中,中间值是3,当前元素也是3,结果是6(3 + 3)。现在我们到达了范围的上限,范围将停止产生元素,inject 返回计算的最后一个中间结果,6

Also, the last question am I right to assume that "p" at the end just stands for puts or print?

差不多。 p 是它自己的野兽。 p x 大致等同于 puts x.inspect; x - 即它以有点不同的格式打印值,并且与总是返回 nilputs 不同,p 返回值不变。因此, block 末尾的 p res 不会通过返回 nil 来破坏代码,而是透明地返回 res

关于ruby - 关于注入(inject)方法: How does it work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42263387/

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