rust - 向量元组的字符串连接

标签 rust

这很简单,但我不知道为什么它不起作用。

fn main() {
    let vector = vec![("foo".to_string(), "bar".to_string())];
    let string = vector[0].0 + vector[0].1;
}

错误

src/main.rs:3:29: 3:40 error: mismatched types:
 expected `&str`,
    found `collections::string::String`
(expected &-ptr,
    found struct `collections::string::String`) [E0308]
src/main.rs:3   let string = vector[0].0 + vector[0].1;
                                           ^~~~~~~~~~~

然后我把它改成这样:

fn main() {
    let vector = vec![("foo".to_string(), "bar".to_string())];
    let string = &*vector[0].0 + &*vector[0].1;
}

得到另一个错误

src/main.rs:3:15: 3:28 error: binary operation `+` cannot be applied to type `&str` [E0369]
src/main.rs:3   let string = &*vector[0].0 + &*vector[0].1;
                             ^~~~~~~~~~~~~
src/main.rs:3:15: 3:28 help: run `rustc --explain E0369` to see a detailed explanation
src/main.rs:3:15: 3:28 note: an implementation of `std::ops::Add` might be missing for `&str`
src/main.rs:3   let string = &*vector[0].0 + &*vector[0].1;
                             ^~~~~~~~~~~~~

我已经用尽了所有我能想到的组合。我在这里缺少什么?

最佳答案

这是行不通的,因为连接仅在 String 上定义,并且它会消耗其左操作数:

let s = "hello ".to_string();
let c = s + "world";
println!("{}", c);  // hello world
println!("{}", s);  // compilation error

因此它需要按值访问字符串,但不能通过在向量上建立索引来完成 - 它们只能返回对向量的引用,而不是值。

有几种方法可以克服这个问题,例如,您可以克隆字符串:

let string = vector[0].0.clone() + &vector[0].1;

或者你可以使用格式化:

let string = format!("{}{}", vector[0].0, vector[0].1);

或者您可以使用 remove() 从向量中取出值或 swap_remove() :

let string = match vector.swap_remove(0) {
    (left, right) => left + right
};

如果您可以丢失向量的状态,那么自然地,后者是合适的。如果要对整个向量执行此操作,最好按值对其进行迭代,并在此过程中使用它:

for (left, right) in vector {
    let string = left + right;
}

关于rust - 向量元组的字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36650238/

相关文章:

rust - 为什么我可以用引用的引用来调用接受引用的函数?

parallel-processing - 为什么基于人造丝的并行处理比串行处理需要更多时间?

rust - "Urlencoded payload size is bigger than allowed (default: 256kB)"

pointers - crossbeam_epoch::Shared::as_raw由 “Converts the pointer to a raw pointer (without the tag)”表示什么?

rust - 通过共享框 ptr 访问时如何使我的结构字段可变?

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 如何在 rust-gdb 中打印调用 Rust 函数的结果?

rust - 如何以编程方式编译 Rust 程序?

iterator - 如何将显式生命周期绑定(bind)到返回的特征?

pattern-matching - 将切片模式与字符串切片一起使用