我很好奇为什么text()
要可变借用字形缓存:
cache: &mut C
我的理解是字形缓存代表从字体文件加载的静态字符(字形)。为什么那些需要能够被底层图形系统变异?
因为如果您从头到尾遵循代码Text
,它似乎会根据每个字体大小按需加载每个字符。如果你要求它提供一个它没有缓存的大小的字符,它会加载它——这需要一个可变引用才能修改它的内部状态。确实,它是使用entry
API 的第一部分——它需要一个可变引用:fn entry(&mut self, key: K) -> Entry<K, V>
有问题的代码:
impl<'a> graphics::character::CharacterCache for GlyphCache<'a> {
type Texture = Texture;
fn character(&mut self, size: FontSize, ch: char) -> &Character {
match {
match self.data.entry(size) { // <----- BAM!
Vacant(entry) => entry.insert(HashMap::new()),
Occupied(entry) => entry.into_mut(),
}
}.contains_key(&ch) {
true => &self.data[&size][&ch],
false => { self.load_character(size, ch); &self.data[&size][&ch] }
// ^^^^ BAM!
}
}
}