在 Windows 上使用 clang v8.0.0(来自 llvm 预构建二进制文件)时,gdb 或 lldb 调试器不会选择源映射表-g或-gline-tables-only源映射表。
包含-g标志文件的大小会增加(这是意料之中的),但 gdb 和 lldb 都没有选择源
当使用 gcc 编译-g时,调试器会检测到(带有标志)源文件。
我曾尝试clang -g <codefile>在 macOS High Sierra(clang -v说它是)上运行相同的命令 ( ),Apple LLVM version 10.0.0 (clang-1000/10.44.4)其中 lldb 正在获取源文件。所以我猜它是本地化到我的 widows 实例或 llvm for windows build。
clang -vWindows 上的PS 输出:
clang version 8.0.0 (tags/RELEASE_800/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
Run Code Online (Sandbox Code Playgroud) 问题是当我输入这样的代码时。
let data = sqlx::query("SELECT id, name FROM test")
.fetch_all(&pool)
.await;
Run Code Online (Sandbox Code Playgroud)
我收到一个no method named `fetch_all` found for struct `sqlx_core::query::Query<'_, _>` in the current scope错误。以下为官方入门自述文件。这也适用于该query_as方法。我怀疑由于某种原因编译器没有“看到”sqlx::Query特征方法,但我不知道如何将它们纳入范围。
虽然当我使用宏时sqlx::query!,.fetch_all确实存在。
另外,还有一个不便之处,rust-analyzerLSP 告诉我变量的类型data是std::result::Result<[type error], [type error]>,这消除了使用自动完成和类型检查的任何可能性,除了运行(众所周知的慢)rust 编译器。
PS 我使用 PostgreSQL 作为数据库解决方案,如果这可能有帮助的话。
PSS 环境变量 DATABASE_URL 在编译时设置并且是正确的,因此宏会执行所有编译时验证工作。
我想写一个简单的记忆功能。
fn memoize<K: Eq + Hash, V: Clone>(mut func: impl FnMut(&K) -> V) -> impl FnMut(K) -> V {
let mut cache = HashMap::new();
|key| {
cache
.entry(key)
.or_insert_with_key(|k| func(k))
.clone()
}
}
Run Code Online (Sandbox Code Playgroud)
Eq + Hash对参数的约束似乎是合理的,但Clone对返回值的约束似乎是不必要的。理想情况下的签名是:
fn memoize<K: Eq + Hash, V>(mut func: impl FnMut(&K) -> V) -> impl FnMut(K) -> &mut V
Run Code Online (Sandbox Code Playgroud)
这需要指定返回引用的生命周期(有意义)。
理想情况&mut V下,只要函数的引用存在,它就应该存在(或者类似的东西&'a mut impl FnMut(K) -> &'a mut V:)
由于 Fn 特征的 impls 不稳定,如果我想留在 Fn 特征内(而不是用 some 编写我的结构fn …