1.4 - טקסט ואוספים ובעלות על האחסון שלהם - פתרון
פתרון גבול בייטים ששומר על קידוד¶
נבחר תחילה את הגבול המקסימלי לפי אורך הקלט, ואז נלך אחורה עד גבול חוקי. בקידוד UTF-8 המרחק לגבול הקודם קטן, אך התקינות שלנו נובעת מהבדיקה ולא מהנחה שכל תו עברי תופס אותו רוחב.
fn prefix(text: &str, budget: usize) -> &str {
let mut end = text.len().min(budget);
while !text.is_char_boundary(end) {
end -= 1;
}
&text[..end]
}
fn main() {
let text = "שלום";
assert_eq!(prefix(text, 0), "");
assert_eq!(prefix(text, 1), "");
assert_eq!(prefix(text, 2), "ש");
assert_eq!(prefix(text, 3), "ש");
assert_eq!(prefix(text, 8), text);
assert_eq!(prefix("abc", 2), "ab");
assert_eq!(prefix("", 100), "");
}
האינדקס אפס הוא תמיד גבול חוקי, ולכן הלולאה אינה יורדת מתחת לאפס. הפונקציה מחזירה פרוסה מתוך הקלט ואינה יוצרת בעלות חדשה. החוזה הזה אינו מבטיח שלא חתכנו באמצע רצף תצוגה של אות וניקוד; הדרישה הייתה גבול קידוד, לא גבול סימן תצוגה.
הפתרון למפה יכול להשתמש בדוגמת ההרצאה, משום שהמחרוזת נשארת חיה לאורך הספירה וההדפסה. אם רוצים להחזיר את המפה מפונקציה שהמחרוזת המקומית שלה תושמד, צריך להחזיר מפתחות בבעלות, למשל String, או להחזיר מבנה שמחזיק גם את האחסון ומייצג בו מיקומים. אי אפשר להאריך את חיי הנתונים באמצעות חתימה בלבד.