test_slices.zig (1828B) - Raw
1 const std = @import("std"); 2 const expect = std.testing.expect; 3 const mem = std.mem; 4 const fmt = std.fmt; 5 6 test "using slices for strings" { 7 // Zig has no concept of strings. String literals are const pointers 8 // to null-terminated arrays of u8, and by convention parameters 9 // that are "strings" are expected to be UTF-8 encoded slices of u8. 10 // Here we coerce *const [5:0]u8 and *const [6:0]u8 to []const u8 11 const hello: []const u8 = "hello"; 12 const world: []const u8 = "世界"; 13 14 var all_together: [100]u8 = undefined; 15 // You can use slice syntax with at least one runtime-known index on an 16 // array to convert an array into a slice. 17 var start: usize = 0; 18 _ = &start; 19 const all_together_slice = all_together[start..]; 20 // String concatenation example. 21 const hello_world = try fmt.bufPrint(all_together_slice, "{s} {s}", .{ hello, world }); 22 23 // Generally, you can use UTF-8 and not worry about whether something is a 24 // string. If you don't need to deal with individual characters, no need 25 // to decode. 26 try expect(mem.eql(u8, hello_world, "hello 世界")); 27 } 28 29 test "slice pointer" { 30 var array: [10]u8 = undefined; 31 const ptr = &array; 32 try expect(@TypeOf(ptr) == *[10]u8); 33 34 // A pointer to an array can be sliced just like an array: 35 var start: usize = 0; 36 var end: usize = 5; 37 _ = .{ &start, &end }; 38 const slice = ptr[start..end]; 39 // The slice is mutable because we sliced a mutable pointer. 40 try expect(@TypeOf(slice) == []u8); 41 slice[2] = 3; 42 try expect(array[2] == 3); 43 44 // Again, slicing with comptime-known indexes will produce another pointer 45 // to an array: 46 const ptr2 = slice[2..3]; 47 try expect(ptr2.len == 1); 48 try expect(ptr2[0] == 3); 49 try expect(@TypeOf(ptr2) == *[1]u8); 50 } 51 52 // test