我正在尝试对 byLine()
返回的范围使用折叠操作。我希望传递给 fold 的 lambda 是一个多行函数。我搜索了谷歌并阅读了文档,但找不到关于函数签名应该是什么的描述。我推测一对是累加和,一个是当前元素。这是我拥有的,但不会构建
auto sum = File( fileName, "r" )
.byLine
.fold!( (a, b)
{
auto len = b.length;
return a + len;
});
我从 dmd 得到的错误是:
main.d(22): Error: no property `fold` for `(File(null, null)).this(fileName, "r").byLine(Flag.no, '\n')` of type `std.stdio.File.ByLineImpl!(char, char)`
所以我的问题有两个方面:
- 我在这种情况下使用折叠是否有效?
- 如何传递 curley 括号 lambda 以进行折叠?
我已经尝试搜索谷歌并阅读 fold 的 dlang 文档。所有文档都使用快捷的 lambda 语法 (a, b) => a + b
。
最佳答案
所以 fold
的工作方式是它接受一个关于如何折叠下一个元素的函数别名列表。如果你不给它提供起始值,它使用第一个元素作为起始值。引用文档(强调我的):
The call
fold!(fun)(range, seed)
first assigns seed to an internal variableresult
, also called the accumulator. Then, for each element x in range,result = fun(result, x)
gets evaluated. Finally,result
is returned. The one-argument versionfold!(fun)(range)
works similarly, but it uses the first element of the range as the seed (the range must be non-empty).
您的原始代码不起作用的原因是您不能将整数添加到字符串(种子是文件的第一行)。
你的最新版本能工作的原因(虽然只在 32 位机器上,因为你不能在 64 位机器上将 size_t 重新分配给 int)是因为你给了它一个起始值 0
播种折叠。所以这是用于您的用例的正确机制。
文档有点奇怪,因为该函数实际上不是同名模板,所以它有两个 文档部分 -- 一个用于模板,一个用于折叠函数。 fold 函数文档列出了 fold
接受的运行时参数,在本例中为输入范围和种子。它的文档链接在这里:https://dlang.org/phobos/std_algorithm_iteration.html#.fold.fold
关于d - 使用 File().byLine() 和 fold(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74668853/