對於常寫 Python 的人應該很熟悉迭代器,在處理一些資料時比單純的陣列好用。Zig 通常使用擁有 next()
方法的 struct
來代表迭代器。
基礎
首先這是標準庫所提供的迭代器 std.mem.split(T, V, S)
,其中 T
是型別,V
是資料,S
是分隔符。使用 .next()
進行迭代,如果回傳 null
則代表迭代完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const std = @import("std"); const print = std.debug.print;
pub fn main() void { const string = "C,C++,Python,TypeScript"; var iter = std.mem.split(u8, string, ",");
while (true) { const item = iter.next(); if (item == null) { break; } print("{s}\n", .{item.?}); } }
|
自製迭代器
Zig 的迭代器並不是特殊語法,只是約定俗成的慣例,如果想要自製迭代器的話,只要實作一個含有 next()
方法的 struct
即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| const std = @import("std"); const print = std.debug.print;
const MyIterator = struct { list: []const i32, exclude: i32, index: usize = 0,
fn next(self: *MyIterator) ?i32 { for (self.list[self.index..]) |item| { self.index += 1; if (item == self.exclude) { continue; } return item; } return null; } };
pub fn main() void { var iter = MyIterator{ .list = &[_]i32{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, .exclude = 5, };
while (true) { const item = iter.next(); if (item == null) { break; } print("{}\n", .{item.?}); } }
|
參考
本文以 Zig 0.13.0
為主。並同時發佈在: