考虑以下示例
fn main () {
f("hello", true);
}
fn f(str: &str, sen: bool) {
let s: &str = match sen {
false => str,
true => str.chars().map(|x| x.to_lowercase()).collect().as_slice()
};
println!("{}", s);
}
我收到此错误
error: the type of this value must be known in this conntext
true => str.chars().map(|x| x.to_lowercase()).collect().as_slice()
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我有点困惑,编译器是否知道函数定义中str
的类型是&str
?我在这里缺少什么?
答案 0 :(得分:4)
错误位置可能令人困惑,这里的问题是collect
方法。它对于任何FromIterator
都是通用的,在这种情况下,编译器cat会推断出类型(编译器看到的是你需要一些实现FromIterator
的类型X,它具有生成& str的as_slice
方法)。
此代码的第二个问题是您尝试从匹配语句返回对本地值(collect的结果)的引用。你不能这样做,因为该值具有该块的生命周期并在之后被释放,因此返回的内容将无效。
一种有效的解决方案(但需要将& str转换为String):
fn main () {
f("hello", true);
}
fn f(str: &str, sen: bool) {
let s: String = match sen {
false => str.to_string(),
true => str.chars().map(|x| x.to_lowercase()).collect()
};
println!("{}", s);
}
我不知道你最终想要达到的目的,但如果这是一个返回切片(MaybeOwned
)或&str
的函数,请查看String