d - 使用 File().byLine() 和 fold()

标签 d

我正在尝试对 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)`

所以我的问题有两个方面:

  1. 我在这种情况下使用折叠是否有效?
  2. 如何传递 curley 括号 lambda 以进行折叠?

我已经尝试搜索谷歌并阅读 fold 的 dlang 文档。所有文档都使用快捷的 lambda 语法 (a, b) => a + b

最佳答案

所以 fold 的工作方式是它接受一个关于如何折叠下一个元素的函数别名列表。如果你不给它提供起始值,它使用第一个元素作为起始值。引用文档(强调我的):

The call fold!(fun)(range, seed) first assigns seed to an internal variable result, also called the accumulator. Then, for each element x in range, result = fun(result, x) gets evaluated. Finally, result is returned. The one-argument version fold!(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/

相关文章:

http - 为获取的文件设置 MIME 类型

editor - 带调试功能的 D-Editor

d - 如何使用联合常量成员?

arrays - 将文件读入 d 中的行数组

linux - 如何将D中的纪元时间(unix时间戳)转换为标准时间(年月日)

c - 使用 D 编程语言的 ncurses api

C++ 或 D : idiom to decouple classes without dynamic dispatch?

multithreading - D编程语言中控制并行线程的数量

operator-overloading - D 是否自动将 opBinary 重写为 opOpAssign?

switch-statement - Switch 语句总是解析为 default 而不是 case