这不是一个典型的问题,而是一个典型的问题.鉴于以下代码:

fn foo() -> Result<String, i32> {
    return Ok("world".to_string());
}

fn bar() -> Result<String, i32> {
    let mut value = String::new();
    value.push_str(&try!(foo())); // this line here

    return Ok("Hello ".to_string() + &value);
}

fn main() {
    match bar() {
        Ok(message) => println!("{}", message),
        _ => return,
    }
}

Rust返回错误:

<std macros>:3:43: 3:46 error: mismatched types:
expected str,
found collections::string::String
(expected str,
found struct collections::string::String) [E0308]
<std macros>:3 $ crate:: result:: Result:: Ok ( val ) => val , $ crate:: result:: Result::
<std macros>:1:1: 6:48 note: in expansion of try!
<std macros>:3:43: 3:46 help: run rustc --explain E0308 to see a detailed explanation
error: aborting due to previous error

如果我捕获try!的结果,并分别将&应用于结果,它会工作(并打印出Hello world):

fn foo() -> Result<String, i32> {
    return Ok("world".to_string());
}

fn bar() -> Result<String, i32> {
    let mut value = String::new();
    let foo_result = try!(foo()); // capture the result of try!
    value.push_str(&foo_result); // now use the result with &

    return Ok("Hello ".to_string() + &value);
}

fn main() {
    match bar() {
        Ok(message) => println!("{}", message),
        _ => return,
    }
}

为什么let foo_result = try!(foo()); value.push_str(&foo_result);行而value.push_str(&try!(foo()));不行?从我天真的Angular 来看,它们似乎是等价的,所以我不确定我不了解 rust 迹的哪个关键部分.

推荐答案

编译器处理块强制的方式似乎有所不同.try!()扩展为match块,编译器无法自动对其进行解列.您的问题可以缩写如下:

fn f(_: &str) {}

fn main() {
    let x = "Akemi Homura".to_owned();

    f(&x); // OK
    f(&(x)); // OK
    f(&{x}); // Error
}

我认为这是编译器的一个缺陷.如RFC 401所述,编译器应该能够使用适当的类型强制块.

块,如果块的类型为U,则块中的最后一个表达式(如果

作为一种解决方法,我建议您直接使用&*try()&try()[..]String转换为&str.两者的意思相同,不过我稍微喜欢前者.

我打开了一个问题来追踪这一点.https://github.com/rust-lang/rust/issues/26978

Rust相关问答推荐

是否有一种可靠的方法可以将Arc弦乐转换/转换为Arc Vec u8>>

关联类型(类型参数)命名约定

将内部类型作为参数的泛型 struct 上的方法

如何找到一个数字在二维数组中的位置(S)?

使用模块中的所有模块,但不包括特定模块

有没有办法避免在While循环中多次borrow `*分支`

如何正确地将App handler传递给Tauri中的其他模块?

如何用Axum/Tower压缩Html内容?

为什么这个变量不需要是可变的?

如何在函数中返回自定义字符串引用?

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

找不到 .has_func 或 .get_func 的 def

如何执行数组文字的编译时串联?

为什么带有生命周期指定的方法不能被调用两次?

不安全块不返回预期值

将 Futures 的生命周期特征绑定到 fn 参数

使用 `clap` 在 Rust CLI 工具中设置布尔标志

Rust 中 `Option` 的内存开销不是常量

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?