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

如何定义可无限链式调用的累加器函数f(2)(3)(10)(100)?

实现支持无限链式调用的累加器函数

需求说明

  • f(2) 返回 2
  • f(2)(3) 返回 5
  • f(2)(3)(10) 返回 15
  • f(2)(3)(10)(100) 返回 115
  • f(2)(3)(10)(100)()()... 可持续返回累加结果

现有尝试代码

static void Main()
{
    Func<int, Func<int, int>> f = (x) =>
    {
        return (y) =>
        {
            return x += y;
        };
    };

    Console.WriteLine(f(2)(3));
    // Console.WriteLine(f(2)(3)(10)); should return 15

}

注:不采用f(param int[] x){}这种参数数组的实现方式。


实现思路

核心是让每次调用后的返回值兼具两种能力:既能接收下一个整数参数继续累加,又能在无参数调用时返回当前总和。在C#中可以通过自定义类+方法重载+隐式转换来实现:

  1. 自定义累加器类,内部维护累加总和;
  2. 重载Invoke方法:一种带int参数,累加后返回自身以支持链式调用;另一种无参数,直接返回当前总和;
  3. 添加隐式转换为int的操作符,让类实例可以直接被当作整数输出;
  4. 入口函数f接收初始值,返回累加器实例。

完整代码实现

using System;

public class Accumulator
{
    private int _total;

    public Accumulator(int initial)
    {
        _total = initial;
    }

    // 带参数调用:累加后返回自身,支持链式调用
    public Accumulator Invoke(int num)
    {
        _total += num;
        return this;
    }

    // 无参数调用:返回当前累加结果
    public int Invoke()
    {
        return _total;
    }

    // 隐式转换为int,直接输出实例时自动转换
    public static implicit operator int(Accumulator acc)
    {
        return acc._total;
    }
}

class Program
{
    static Accumulator f(int initial)
    {
        return new Accumulator(initial);
    }

    static void Main()
    {
        Console.WriteLine(f(2)); // 输出2
        Console.WriteLine(f(2)(3)); // 输出5
        Console.WriteLine(f(2)(3)(10)); // 输出15
        Console.WriteLine(f(2)(3)(10)(100)); // 输出115
        Console.WriteLine(f(2)(3)(10)(100)()); // 输出115
        Console.WriteLine(f(2)(3)(10)(100)()()); // 输出115
    }
}

代码说明

  • f(initial)返回Accumulator实例,由于隐式转换为int,直接输出时会显示初始值;
  • 带参数的链式调用(如f(2)(3))本质是调用Invoke(int),累加后返回自身,保证链式调用的连续性;
  • 无参数调用()会触发Invoke(),直接返回当前总和,后续多次无参数调用也会持续返回该值;
  • 完全规避了参数数组的使用,严格符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:52:43