匹配元组错误预期字符串但找到选项&lt; <generic#5 =“”>&gt; </generic>

时间:2014-07-17 03:47:31

标签: rust

我遇到这个错误,在处理函数中的匹配时似乎无法理解,所以目前我有字符串元组:let mut bitmap_point: Vec<(&str, &str)> = vec![];我希望在函数{{1}中使用它所以我声明了这个:

convert_to_binary

但是在用

调用函数时
fn convert_to_binary_string(tup: &(&str,&str) ) -> String{
  let mut stringval: String =
  match tup {
    &(x,y) => from_str(x)
  };
  return stringval;
}

我收到错误:

let h = convert_to_binary_string( bitmap_point.get(0) );
任何人都可以解释我的错误吗?

2 个答案:

答案 0 :(得分:3)

你这是错误的方式。如果您只想将&str(字符串切片)转换为String(拥有的字符串),则应使用.to_string() methodString::from_str(str)

FromStr特征基于转换的Option类型,其中并非所有输入都具有有效输出 - 例如。 from_str::<int>("four")将返回None,因为它只能处理数字文字。你把某些东西变成字符串的地方,没有失败的情况,from_str(str).unwrap()是一种混乱的方式。

以下是实现目标的更惯用的代码(使用ref1()):

fn convert_to_binary_string(tup: &(&str, &str)) -> String {
    tup.ref1().to_string()
}

如果没有ref1()使用匹配,可以轻松地重写,或者使用简单的let绑定:

fn convert_to_binary_string(tup: &(&str, &str)) -> String {
    let &(x, _) = tup;
    x.to_string()
}

但作为一般规则,你可能不应该使用元组 - 通常使用具有有意义命名字段的结构通常是更好的主意,例如。

struct Foo<'a> {
    x: &'a str,
    y: &'a str,
}

......那就是

fn convert_to_binary_string(foo: &Foo) -> String {
    foo.x.to_string()
}

在那个阶段,你可以完全放弃这个方法。

答案 1 :(得分:0)

好的,所以答案只是进行了简单的文档搜索,我找到了答案,我的问题是from_str(&str)返回-> Option<T>,其值可以是Some或{{1} }。这就是我收到如上所示的选项错误的原因。

要解决此问题,请查看Rust的文档并找到一个函数None,它可以将unwrap()拉出选项变量。一切都按预期工作,我的最终功能是:

T