【发布时间】:2018-06-19 20:47:04
【问题描述】:
我有一些代码应该从数据库中获取图像文件名并将它们添加到向量中。
extern crate postgres;
use postgres::{Connection, TlsMode};
fn main() {
let conn = Connection::connect(
"postgres://postgres:password@localhost:5432/test",
TlsMode::None,
).unwrap();
let mut filenames = Vec::new();
if let Ok(filename_results) = conn.query("SELECT filename FROM images", &[]) {
for row in &filename_results {
filenames.push(format!("{}.jpg", row.get(0)));
}
}
println!("{:?}", filenames);
}
这失败了:
error[E0283]: type annotations required: cannot resolve `_: postgres::types::FromSql`
--> src/main.rs:14:54
|
14 | filenames.push(format!("{}.jpg", row.get(0)));
| ^^^
我不明白为什么 Rust 无法在这种情况下找出类型,尽管我已经找到了让它工作的方法。我想知道告诉format!() 它应该期待什么类型的最简单/惯用的方法是什么,以及为什么 row.get(0) 不需要类型注释,除非我在它周围加上一个格式!()。这是我对解决方案的最佳尝试:
for row in &filename_results {
let filename: String = row.get(0);
filenames.push(format!("{}.jpg", filename));
}
【问题讨论】:
-
我相信How do I imply the type of the value when there are no type parameters or ascriptions?的答案已经回答了您的问题。如果您不同意,请edit您的问题解释差异。否则,我们可以将此问题标记为已回答。
-
已编辑以添加周围代码并删除结构。我真的不明白你链接的问题与我的问题有什么关系 - 至少,我的技能水平不允许我将那个答案翻译成我的答案。我的问题涉及 psql 和格式之间的交互!我无法判断潜在问题是否与您在 impl{} 块内无法传递 &self 以外的参数时遇到的问题相同,但是有足够的差异,我无法找到那个问题。我可以说它们都是关于类型的,但仅此而已。
-
我从你的其他评论中得到的信息是
row.get::<String>(0),它失败了,因为 0 不是字符串。row.get::<_, String>(0)可以工作,这正是我想要的。否则,你有什么理由认为单线风格更好吗?是为了避免使“图像”可变吗? -
我在您的回答中没有看到的关于 turbofish 的一个奇怪的事情是,前 n 个参数是函数的参数,而最后一个参数指定了推断的返回类型。就我而言,我认为从那个答案中并不能清楚地看出我必须使用 <_ string> 来匹配 0 和 row.get() 的类型。
-
希望你不要介意。我已经写了你在这里解决的问题作为答案。我同意 Timofey 的观点,除非您已经了解发生了什么,否则链接问题的答案是否也能回答这个问题并不明显,因此我试图解释其中的联系。
标签: rust