ผมเขียน code ห่วย พอเขียน test ก็เจอ bug ตลอด
code แค่นี้เลย
fn cnt_links(s: usize, e: usize, tu: &Textunit, en_sent: &RTok) -> usize {
tu.links.iter()
.filter(|link| link.target > s && link.target < e)
.filter(|link| link.source >= en_sent.s && link.source < en_sent.e)
.count()
}
พอเขียน test แบบยาว ก็เจอจุดพัง
#[test]
fn cnt_links_simple() {
let tu = Textunit {
bi_text: BiText { source: String::from(""),
target: String::from(""),
},
bi_rtoks: BiRToks {
source: vec![RTok {s:100, e:101, text: String::from(" ")},
RTok {s:102, e:103, text: String::from(" ")},],
target: vec![RTok {s:300, e:301, text: String::from(" ")},
RTok {s:302, e:303, text: String::from(" ")},],
},
links: vec![Link {source: 0, target: 1},
Link {source: 1, target: 0}],
};
let en_sent = RTok {s: 302, e:303, text: String::from(" ")};
assert_eq!(cnt_links(0, 1, &tu, &en_sent), 1);
}
ระบบ type ช่วยอะไรไม่ค่อยได้เพราะมันเป็น integer หมด ยกเว้นจะใช้ type แบบที่มีหน่วยได้ แต่แบบนั้นก็ไม่รู้ว่าโปรแกรมจะยาวกว่านี้อีกเปล่า
รู้สึกว่าปัญหาของโปรแกรมนี้หลัก ๆ เลยคือ test มันยาวเกิน