1

我必须将 i8 数字转换为 u8 ( @intCast()),以便将其添加到 ArrayList(如果数字为负数,我不关心如何进行此转换)。

用它运行这个程序zig test intcast.zig会返回All 1 tests passed.

const std = @import("std");

const SIZE = 30_000;

test "Convert i8 to u8" {
    var memory :[SIZE]i8 = [_]i8{65} ** SIZE;
    var memory_index: u32 = 10;
    var output = std.ArrayList(u8).init(std.heap.page_allocator);
    defer output.deinit();

    try output.append(@intCast(u8, memory[memory_index]));

    std.testing.expectEqualSlices(u8, "A", output.items);
}

但是当我尝试在另一个程序中使用相同的过程时,它不起作用,编译器返回以下错误:

≻ zig test bf.zig
./bf.zig:15:22: error: expected type '[30000]i8', found '@TypeOf(std.array_list.ArrayListAligned(u8,null).append).ReturnType.ErrorSet'
            '.' => { try output.append(@intCast(u8, memory[memory_index])); },

这是程序,这是我附加转换后的数字的地方:

for (program) |command| {
    switch (command) {
        '+' => { memory[memory_index] += 1; },
        '-' => { memory[memory_index] -= 1; },
        '.' => { try output.append(@intCast(u8, memory[memory_index])); },

请问,谁能告诉我我做错了什么?

我的 zig 是0.6.0+8b82c4010.

4

1 回答 1

2

这与 intCast 无关,问题是函数的返回类型不允许出现可能的错误

fn execute(program: []const u8) [MEMORY_SIZE]i8 {
    for (program) |command| {
        switch (command) {
            '+' => { memory[memory_index] += 1; },
            '-' => { memory[memory_index] -= 1; },
            '.' => { try output.append(@intCast(u8, memory[memory_index])); },
//                   ^^^ try wants to return an error, but
//                       the function's return type is [30000]i8
//                       which cannot be an error
    ...
}

简单修复:允许函数返回错误

fn execute(program: []const u8) ![MEMORY_SIZE]i8 {

这个错误现在不是很好,但如果你仔细观察“found”类型,有些东西正试图从 to 转换,这是@TypeOf(...).ReturnType.ErrorSet无法[30000]i8完成的。但是,可以从 转换@TypeOf(...).ReturnType.ErrorSet![30000]i8

try something()相当于something() catch |err| return err;类型错误的来源。

于 2020-07-14T05:32:47.153 回答