test "error union if" {
var ent_num: error{UnknownEntity}!u32 = error.UnknownEntity;
if (ent_num) |entity| {
try expect(@TypeOf(entity) == u32);
try expect(entity == 5);
} else |err| {
_ = err catch |err1| { // compiles fine when this block is removed
std.debug.print("{s}", .{err1});
};
std.debug.print("{s}", .{err});
}
}
./main.zig:125:5: error: expected error union type, found 'error:124:18'
if (ent_num) |entity| {
^
./main.zig:129:17: note: referenced here
_ = err catch |err1| {
error:124:18
refers to the error{UnknownEntity}
because it's
anonymous. so prints the definition address.if (my_var) |v| ...
syntax can only be used for optional
types. for Error unions you must use try
or catch
.try
and catch
can't be used for Error Setyour code would be this:
const std = @import("std");
const expect = std.testing.expect;
test "error union if" {
var ent_num: error{UnknownEntity}!u32 = error.UnknownEntity;
const entity: u32 = ent_num catch |err| {
std.debug.print("{s}", .{err});
return;
};
try expect(@TypeOf(entity) == u32);
try expect(entity == 5);
}
reading the programs or libraries is very useful for learning a new language. gl