将None传递给接受Option的函数

时间:2016-06-17 16:35:11

标签: rust

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的附加行,如何解决这个问题?

1 个答案:

答案 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()的语法”之一。 这有助于推理算法明确了解您尝试解析的类型。