zig 获取环境变量 (linux)

问题描述 投票:0回答:1

我正在努力学习zig。

我在 0.14.dev 上,我只想获取带有一些默认值的 env 变量。文档在这里https://ziglang.org/documentation/master/std/#std.process.getEnvVarOwned,这表明如果变量不存在,则会引发错误。现在,如果出现任何其他错误(例如 OutOfMemory),我希望它传播。

const std = @import("std");

pub fn main() !void {
    var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
    defer arena.deinit();
    const allocator = arena.allocator();

    const db_path = std.process.getEnvVarOwned(allocator, "DB_PATH") catch |err| {
        if (err == std.process.GetEnvVarOwnedError.EnvironmentVariableNotFound) {
            return "/path";
        } else {
            return err;
        }
    };

    std.debug.print("path: {s}\n", .{db_path});
}

这给了我这个错误:

src/main.zig:11:20: error: expected type '@typeInfo(@typeInfo(@TypeOf(main.main)).@"fn".return_type.?).error_union.error_set!void', found '*const [5:0]u8'
            return "/path";
                   ^~~~~~~
src/main.zig:4:16: note: function return type declared here
pub fn main() !void {
               ^~~~

您能提供正确的代码吗?

error-handling zig
1个回答
0
投票

如果你想从

catch
“返回”一个值,你不能使用
return
,它会从函数中返回,但函数不能返回字符串;它的返回类型是
!void

您可以使用带有

break
的标记块:

const db_path = ... catch |err| blk: {
    if (...) {
        break :blk "/path";
    } else {
        return err;
    }
};

标签的名称是任意的,

blk
经常按约定使用。

© www.soinside.com 2019 - 2024. All rights reserved.