iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0

對於常寫 Python 的人應該很熟悉迭代器,在處理一些資料時比單純的陣列好用。Zig 通常使用擁有 next() 方法的 struct 來代表迭代器。

基礎

首先這是標準庫所提供的迭代器 std.mem.split(T, V, S),其中 T 是型別,V 是資料,S 是分隔符。使用 .next() 進行迭代,如果回傳 null 則代表迭代完成。

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.?});
    }
}
C
C++
Python
TypeScript

自製迭代器

Zig 的迭代器並不是特殊語法,只是約定俗成的慣例,如果想要自製迭代器的話,只要實作一個含有 next() 方法的 struct 即可。

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.?});
    }
}
1
2
3
4
6
7
8
9
10

參考

本文以 Zig 0.13.0 爲主。並同時發佈在:


上一篇
Zig:標籤 Labeled
下一篇
Zig:進階迴圈
系列文
Zig 語言入門指南——聽説你是現代化的 C30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言