仅在特定程序中将转换后的 u8(从 i8)附加到 ArrayList 时出错
Error to append a converted u8 (from i8) to an ArrayList, only in a specific program
我必须将 i8 数字转换为 u8 (@intCast()
),以便将其添加到 ArrayList(我不关心如果数字为负数将如何完成此转换)。
运行这个程序用zig test intcast.zig
吧returnsAll 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);
}
但是当我尝试在另一个程序中使用相同的过程时,它不起作用,编译器 returns 我出现以下错误:
≻ 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])); },
Here is the the program,这是我附加转换后的数字的地方:
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
。
这与 intCast 无关,问题是函数的 return 类型不允许可能的错误
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
...
}
简单修复:允许函数return出错
fn execute(program: []const u8) ![MEMORY_SIZE]i8 {
目前这个错误不是很好,但是如果你仔细观察“found”类型,有些东西正试图从 @TypeOf(...).ReturnType.ErrorSet
转换为 [30000]i8
而那不可能完毕。但是,可以从 @TypeOf(...).ReturnType.ErrorSet
转换为 ![30000]i8
try something()
等同于 something() catch |err| return err;
,这是类型错误的来源。
我必须将 i8 数字转换为 u8 (@intCast()
),以便将其添加到 ArrayList(我不关心如果数字为负数将如何完成此转换)。
运行这个程序用zig test intcast.zig
吧returnsAll 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);
}
但是当我尝试在另一个程序中使用相同的过程时,它不起作用,编译器 returns 我出现以下错误:
≻ 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])); },
Here is the the program,这是我附加转换后的数字的地方:
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
。
这与 intCast 无关,问题是函数的 return 类型不允许可能的错误
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
...
}
简单修复:允许函数return出错
fn execute(program: []const u8) ![MEMORY_SIZE]i8 {
目前这个错误不是很好,但是如果你仔细观察“found”类型,有些东西正试图从 @TypeOf(...).ReturnType.ErrorSet
转换为 [30000]i8
而那不可能完毕。但是,可以从 @TypeOf(...).ReturnType.ErrorSet
转换为 ![30000]i8
try something()
等同于 something() catch |err| return err;
,这是类型错误的来源。