我遇到这个错误,在处理函数中的匹配时似乎无法理解,所以目前我有字符串元组: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) );
任何人都可以解释我的错误吗?
答案 0 :(得分:3)
你这是错误的方式。如果您只想将&str
(字符串切片)转换为String
(拥有的字符串),则应使用.to_string()
method或String::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