string - 不匹配的类型 : expected &str found String when assigning string

标签 string reference rust

我正在尝试根据参数的数量分配变量值(类型 String):

let mut out_filename = "";
let args: Vec<_> = env::args().collect();
match args.len() {
    2 => out_filename = args[1],
    3 => out_filename = args[2],
    _ => panic!("To many params !"),
};

我得到了

src/main.rs:39:29: 39:36 error: mismatched types:
 expected `&str`,
    found `collections::string::String`
(expected &-ptr,
    found struct `collections::string::String`) [E0308]
src/main.rs:39         2 => out_filename = args[1],

匹配值(1,2,3)只是一个选择器,返回类型不同的匹配语句怎么写?没有 let var = match ..

最佳答案

您使用字符串文字初始化了 out_filename。字符串文字的类型是&str(或者更具体地说,&'static str),它不同于String

最简单的解决方案是将 out_filename 直接分配给 match 表达式的结果:

use std::env;

fn main() {
    let args: Vec<_> = env::args().collect();
    let out_filename = match args.len() {
        2 => &args[1],
        3 => &args[2],
        _ => panic!("Too many params !"),
    };
}

[...] what if I wanted to make group of assignments based on args count like inside code block {} ? [...] Is there any way to get working code with basic match without let var = match { assign ?

您可以简单地在 match 表达式之前放置一些没有初始化器的 let 语句,并在每个臂中适本地初始化变量。如果你尝试使用一个可能 undefined variable ,你会得到一个编译器错误,除非你用 let mut 定义变量,如果你试图分配一个变量,你也会得到一个错误在特定代码路径上多次变量。

use std::env;

fn main() {
    let args: Vec<_> = env::args().collect();
    let out_filename;
    match args.len() {
        2 => out_filename = &args[1],
        3 => out_filename = &args[2],
        _ => panic!("Too many params !"),
    };
}

关于string - 不匹配的类型 : expected &str found String when assigning string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36380094/

相关文章:

python - "=="和 "is"之间有区别吗?

c++ - 使用 placement new 更新引用成员?

rust - 如何将动态数量的类型参数传递给函数?

php - 有什么方法可以计算字符串的像素长度?

Java:从线程操作非静态变量?

c++ - 尝试引用已删除的函数时出错

rust - 当我在 IC jar 中使用 `ic_cdk::spawn` 然后出现 panic 时会发生什么?

c++ - 如何将 UE4 FString 转换为字符串?

c# - 格式化 double 值,如货币但不带货币符号 (C#)

ubuntu - 使用 prefer-dynamic 时无法执行 hello world 项目