1

语境

对语言非常陌生,所以请耐心等待。我正在编写一个超级基本函数来打印出传递给程序的命令行参数。这是关键逻辑:

    // already created allocator (std.heap.ArenaAllocator) and iterator (std.process.ArgIterator)

    var idx: u16 = 0;
    while (true) {
        var arg = iterator.next(&allocator.allocator) catch |err| {
            // ...
        };
        if (arg == null) {
            print("End of arguments, exiting.", .{});
            break;
        }
        print("Argument {d}: {s}", .{idx, arg});
        idx += 1;
    }

但是,我收到一条错误消息:

error: expected error union type, found '?std.process.NextError![:0]u8'
var arg = iterator.next(&allocator.allocator) catch |err| return err;

我认为这个问题与NextError返回可选错误联合的事实有关。我不能确定,因为我没有找到任何涵盖这个特定案例的文档。

问题

我通过删除捕获并假装返回类型的错误部分不存在来使此代码工作。但问题是,捕捉该错误的正确方法是什么?

4

1 回答 1

2

您需要使用.?或将其放入else一个捕获中:

    if (arg == null) {
        print("End of arguments, exiting.", .{});
        break;
    } 
    print("Argument {d}: {s}", .{idx, arg.?});
    idx += 1;

    if (arg) |a| {
        print("Argument {d}: {s}", .{idx, a});
        idx += 1;
    } else {
        print("End of arguments, exiting.", .{});
        break;
    }
于 2021-09-28T14:18:07.620 回答