You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D语言中byLine返回Range调用fold及多行Lambda使用问题

问题解答

1. 此处使用fold是否有效?

完全有效,但你的代码存在两个关键问题导致编译失败:

  • 未导入std.algorithm.iteration模块:fold是该模块中的自由函数,不是Range类型的成员方法,必须显式导入才能使用。
  • 缺少初始累加值:fold需要一个初始值作为累加的起点,你的代码里没有传递这个参数。

只要修正这两个问题,就可以用fold遍历byLine返回的Range,实现每行长度的累加。

2. 如何向fold传递大括号形式的多行lambda?

有两种常用方式:

方式一:直接在模板参数中编写多行lambda

确保语法正确、换行和括号匹配即可,同时别忘了传递初始值:

import std.stdio;
import std.algorithm.iteration;

void main(string[] args) {
    string fileName = "your_file.txt";
    auto sum = File(fileName, "r")
        .byLine
        .fold!((a, b) {
            auto len = b.length;
            return a + len;
        })(0); // 0是初始累加值,类型需与最终结果匹配
}

方式二:先定义lambda变量,再传入模板参数

如果多行lambda逻辑复杂,先把它定义成单独的委托变量,再传给fold,代码可读性更好:

import std.stdio;
import std.algorithm.iteration;

void main(string[] args) {
    string fileName = "your_file.txt";
    
    // 定义多行lambda
    auto calcTotalLength = (size_t acc, const(char)[] line) {
        auto lineLen = line.length;
        // 可在此添加更多逻辑,比如过滤空行、跳过注释行等
        return acc + lineLen;
    };
    
    auto sum = File(fileName, "r")
        .byLine
        .fold!(calcTotalLength)(0);
}

额外说明

  • fold的模板参数接受任意可调用对象(lambda、函数指针、委托均可),多行lambda只要语法正确就能正常传递。
  • 注意累加值和当前元素的类型匹配,比如示例中用size_t作为累加类型,可避免整数溢出问题。

内容的提问来源于stack exchange,提问作者Commodore63

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:40:20