อิกัวนาต้นฉบับดึงถาดชิ้นส่วนจากปลายขวาของรางย้อนกลับทีละช่องบนโต๊ะมิ้นต์

Zig splitBackwardsSequence: แยก path จากด้านท้ายโดยไม่ reverse ข้อมูล

พี่โชว์Engineering

เวลาต้องการเพียงชื่อไฟล์หรือส่วนท้ายไม่กี่ชิ้น การ split จากซ้ายทั้งเส้นทำงานเกินโจทย์ครับ std.mem.splitBackwardsSequence เริ่มคืน slice จากด้านท้าย และมอง delimiter หลายไบต์เป็นหนึ่งหน่วยโดยไม่กลับลำดับข้อมูลต้นฉบับ

WHY: เปิดกล่องจากฝั่งที่ของอยู่

ถ้าชั้นเก็บของยาวแต่ของที่ต้องหยิบอยู่ปลายขวา เราไม่ควรรื้อจากซ้ายทุกช่อง Iterator ย้อนหลังช่วยหยุดหลังได้ผลที่ต้องการ และ slice ที่คืนมายืม buffer เดิม จึงไม่มี allocation หรือ copy แต่ caller ต้องรักษา input ให้อยู่ตลอดช่วงใช้งาน

const std = @import("std");

fn tailTwo(input: []const u8) struct { last: []const u8, parent: []const u8 } {
    var parts = std.mem.splitBackwardsSequence(u8, input, "::");
    return .{
        .last = parts.next() orelse "",
        .parent = parts.next() orelse "",
    };
}

test "split from the end and preserve empty fields" {
    const got = tailTwo("team::service::worker");
    try std.testing.expectEqualStrings("worker", got.last);
    try std.testing.expectEqualStrings("service", got.parent);

    var trailing = std.mem.splitBackwardsSequence(u8, "a::b::", "::");
    try std.testing.expectEqualStrings("", trailing.next().?);
    try std.testing.expectEqualStrings("b", trailing.next().?);
    try std.testing.expectEqualStrings("a", trailing.next().?);
    try std.testing.expect(trailing.next() == null);
}

เลือก sequence, any หรือ scalar ให้ตรงความหมาย

splitBackwardsScalar เหมาะกับตัวคั่นค่าเดียว ส่วน splitBackwardsAny ถือสมาชิกตัวใดตัวหนึ่งในชุดเป็นตัวแบ่ง แต่ splitBackwardsSequence ต้องพบ delimiter ทั้งลำดับ เช่น :: จึงไม่ทำให้เครื่องหมายคู่แตกเป็นช่องว่างเกินจริง

ตัวคั่นท้ายสร้าง field ว่าง ซึ่งอาจเป็นข้อมูลสำคัญของ format อย่ากรอง empty slice โดยอัตโนมัติ หากต้องการข้ามช่องว่างทั้งหมด tokenize... เป็น family ที่สื่อ intent ต่างกันชัดกว่า และห้ามคืน slice ออกไปหลัง buffer เจ้าของถูกปล่อย

Recap

  • เริ่มจากด้านท้ายเมื่อ consumer ต้องการ suffix ไม่กี่ส่วน
  • ใช้ Sequence เมื่อ delimiter มีหลาย byte ที่ต้องตรงทั้งก้อน
  • กำหนดความหมายของ field ว่างให้ชัด
  • รักษา lifetime ของ input ตราบใดที่ผลลัพธ์ยังถูกใช้