- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
这部分代码计算每个算术系列的值,直到并包括用户输入的数字:
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 ,但是例如 res
和 e
代表什么? (e
可能是元素?)(0)
代表什么?做什么
做什么?(1..num)
和 inject(0)
有什么联系?p
仅代表 puts
或 print
是否正确?最佳答案
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)的可枚举的第一个元素:res
是 0
和 e
是 1
。 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
- 即它以有点不同的格式打印值,并且与总是返回 nil
的 puts
不同,p
返回值不变。因此, block 末尾的 p res
不会通过返回 nil
来破坏代码,而是透明地返回 res
。
关于ruby - 关于注入(inject)方法: How does it work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42263387/
我是一名优秀的程序员,十分优秀!