模式匹配中的错误“此值的类型必须在此上下文中已知”

时间:2014-09-13 08:59:54

标签: rust

考虑以下示例

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?我在这里缺少什么?

1 个答案:

答案 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