Kiểm Tra Tiền Tố Chuỗi Trong Lua - nói dối e blog

Kiểm Tra Tiền Tố Chuỗi Trong Lua

Kỹ thuật nhỏ trong Lua để kiểm tra tiền tố chuỗi
Khi xây dựng bộ gỡ lỗi Lua, mình gặp bài toán kiểm tra xem một chuỗi có bắt đầu bằng ký tự “@” hay không. Có 3 cách tiếp cận thú vị như sau:

1. Dùng string.sub()

1
string.sub(str, 1, 1) == "@"  

Cách này trực quan dễ hiểu, nhưng mỗi lần gọi sẽ tạo ra chuỗi con mới và thực hiện hashing. Trong môi trường xử lý hiệu năng cao, việc này có thể tạo ra độ trễ nhỏ.

2. Dùng string.byte() để tối ưu tốc độ

1
string.byte(str) == 64  

Phương pháp này kiểm tra giá trị ASCII của ký tự đầu tiên (64 tương ứng với “@”) mà không cần tạo chuỗi trung gian. Đây là lựa chọn nhanh nhất nếu chỉ kiểm tra một ký tự đơn lẻ. Tuy nhiên, bạn cần tra cứu bảng mã ASCII và phương pháp này không mở rộng cho các tiền tố dài hơn (ví dụ: “prefix_”).

3. Dùng string.find() với vị trí bắt buộc

1
string.find(str, "@") == 1  

Mặc dù trực quan giống như cách 1, nhưng trong ngữ cảnh đặc thù của mình (kiểm tra đường dẫn source code thường bắt đầu bằng “@”), phương pháp này lại hiệu quả hơn. Khi đa số trường hợp là TRUE, string.find() sẽ thoát sớm ngay khi khớp ký tự đầu tiên. Tuy nhiên cần lưu ý: Nếu kết quả thường xuyên là FALSE, hiệu năng sẽ kém hơn hai phương pháp kia.

Kết luận & Khuyến nghị

  • Dùng string.byte() nếu cần tốc độ tối ưu và chỉ kiểm tra 1 ký tự
  • Dùng string.find() khi tiền tố thường xuất hiện và muốn code dễ đọc
  • Tránh dùng string.sub() trong vòng lặp hoặc hàm gọi liên tục

Bonus: Nếu cần kiểm tra tiền tố dài hơn (ví dụ “module_”), có thể kết hợp string.sub() với so sánh trực tiếp hoặc viết hàm kiểm tra thủ công:

1
2
3
function starts_with(str, prefix)  
  return string.sub(str, 1, #prefix) == prefix  
end  
0%