「这是我参与11月更文挑战的第 7 天,活动详情查看:2021最后一次更文挑战」
REPL
既然我们是以SQLite为模型,那么我们不妨试着照搬SQLite的样子,以方便用户使用。当你运行sqlite3
时,SQLite启动一个 读-执行-打印 的循环,又称:REPL
。
1 | shell复制代码❯ sqlite3 |
首先为了实现上述结果,这里要做出一些设计选择。由于这个项目的重点是研究和建立一个数据库,大部分开发精力集中于此,这意味着我不想花大部分时间重新发明轮子和编写CLI解释器或REPL逻辑。因此,对于这些,我决定利用已经开发的、有点成熟的第三方库来完成。不过也许在未来,如果有一些空闲时间,并且使用这些第三方库确实影响了应用程序的整体性能,我可以随时回来替换。
REPL的逻辑是非常直接:
一个无限循环中,打印一个提示,获得一个输入行,验证然后处理该行。
我决定使用 rustyline crate
,它已经相当成熟,内存效率高,而且已经解决了很多我们必须处理的问题,甚至从用户体验方面来说,例如,实时提供提示和自动完成,这是一个非常好的功能。
因此,在正式编写代码前,你可以在Github上找到它。下面我将使用一个demo snippet,快速演示 rustyline
是如何通过一个简单的例子工作的:
首先,需要在你的 cargo.toml
中添加该依赖关系:
1 | toml复制代码[dependencies] |
main.rs
中:
1 | rust复制代码use rustyline::error::ReadlineError; |
就这样,有了上述代码,你就有了一个基本的REPL程序,开始开始运行。
本文转载自: 掘金