【译】 第六章:搜索
本文翻译自:Hecto, Chapter 6: Search – Philipp Flenker – Engineering Manager ,封面图也来自于此。 我们完成了文本编辑器 — 能打开、编辑和保存文件。接下来的两个功能给它增添了更多的能力。我们会实现一个小小的搜索功能。 为此,我们重用 prompt() 。当用户输入查询请求并按下回车时,我们会遍历文件中的所有行,如果某行包含查询字符串,会移动光标到匹配的位置。为了达到这个目标,我们需要一个在单行搜索并返回匹配位置的方法。现在让我们开始实现。 到 GitHub 查看这一步。 // 译者注:editor.rs 中 135-142 代码如下 Key::Ctrl('f') => { if let Some(query) = self.prompt("Search: ").unwrap_or(None) { if let Some(position) = self.document.find(&query[..]) { self.cursor_position = position; } else { self.status_message = StatusMessage::from(format!("Not found: {}.", query)); } } } 我们先从 Raw 开始,过一遍这次改动。我们添加了一个返回 Option 的函数。Option 要么包含匹配单词的 x 坐标,要么是 None。用 String 中的 find 方法检错匹配单词的字节索引。记住这可能跟字形索引不太一样!为了把字节索引转换为字形索引,我们使用了一个稍微有点绕的循环。让我们解释一下。grapheme_indices() 为字符串中每一个字形返回一对 (byte_index, grapheme) 的迭代器。enumerate() 枚举这个迭代器,所以,它会给我们迭代器元素的索引。我们利用这一特点,遍历迭代器,直到我们到达与我们匹配单词有相同索引的字形,并返回相应的字形索引。 ...