rust-ini有一个功能:
pub fn section<'a, S>(&'a self, name: Option<S>) -> Option<&'a Properties>
where S: Into<String>
我想读一个没有部分的文件,所以我这样称呼它:
let ifo_cfg = match Ini::load_from_file("conf.ini") {
Result::Ok(cfg) => cfg,
Result::Err(err) => return Result::Err(err.msg),
};
let section = ifo_cfg.section(None).unwrap();
但它给出了编译错误:
无法推断出有关
_
的足够类型信息;键入注释或 需要通用参数绑定[E0282]
我可以这样解决:
let none: Option<String> = None;
let section = ifo_cfg.section(none).unwrap();
如果没有none
的附加行,如何解决这个问题?
答案 0 :(得分:6)
您可以使用以下代码为T
的{{1}}类型指定Option<T>
的类型:
None
或者,您可以指定方法let section = ifo_cfg.section(None::<String>).unwrap();
// ^^^^^^^^^^ forces the type to be Option<String>
的类型S
:
section
您也可以查看E0282's explanation,虽然目前可能无法回答您的问题:)
语法let section = ifo_cfg.section::<String>(None).unwrap();
// ^^^^^^^^^^ forces S = String
有时称为the turbofish。一些非常通用的方法(如::<T,U,V>
和String::parse()
)几乎可以返回任何内容,类型推断没有足够的信息来查找实际类型。 Iterator::collect()
允许人告诉编译器应该替换哪个泛型参数。来自::<T,U,V>
的参考:
因为
parse()
如此普遍,所以它可能会导致类型推断出现问题。因此,parse()
是少数几次您会看到被亲切地称为“turofofish&#39;:parse()
的语法”之一。 这有助于推理算法明确了解您尝试解析的类型。