programing

문자열 리터럴과 문자열을 일치시키는 방법은 무엇입니까?

mailnote 2023. 5. 1. 21:42
반응형

문자열 리터럴과 문자열을 일치시키는 방법은 무엇입니까?

나는 어떻게 그것과 일치하는지 알아내려고 노력 중입니다.String러스트에서

처음에는 이렇게 매칭을 해봤는데 러스트가 암시적으로 캐스팅을 할 수 없다는 것을 알게 되었습니다.std::string::String로.&str.

fn main() {
    let stringthing = String::from("c");
    match stringthing {
        "a" => println!("0"),
        "b" => println!("1"),
        "c" => println!("2"),
    }
}

다음 오류가 발생했습니다.

error[E0308]: mismatched types
 --> src/main.rs:4:9
  |
4 |         "a" => println!("0"),
  |         ^^^ expected struct `std::string::String`, found reference
  |
  = note: expected type `std::string::String`
             found type `&'static str`

그리고 나서 저는 새로운 것을 만들기 위해 노력했습니다.String내가 캐스팅할 기능을 찾을 수 없었기 때문에 물체.String아주&str.

fn main() {
    let stringthing = String::from("c");
    match stringthing {
        String::from("a") => println!("0"),
        String::from("b") => println!("1"),
        String::from("c") => println!("2"),
    }
}

이로 인해 다음과 같은 오류가 3번 발생했습니다.

error[E0164]: `String::from` does not name a tuple variant or a tuple struct
 --> src/main.rs:4:9
  |
4 |         String::from("a") => return 0,
  |         ^^^^^^^^^^^^^^^^^ not a tuple variant or struct

실제로 일치시키는 방법String죄는 러스트?

업데이트: 사용.as_str()이렇게 변환합니다.String완전히&str:

match stringthing.as_str() {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}

이유 .as_str()보다 간결하고 엄격한 유형 검사를 적용합니다.특성as_ref여러 유형에 대해 구현되며 유형에 대해 동작이 변경될 수 있습니다.String예상치 못한 결과로 이어집니다.마찬가지로, 입력 인수가 유형을 변경하면 컴파일러는 해당 유형이 특성을 구현할 때 문제 신호를 보내지 않습니다.as_ref.

문서에는 다음과 같은 내용이 있습니다.as_str또한 https://doc.rust-lang.org/std/string/struct.String.html, https://doc.rust-lang.org/std/primitive.str.html

이전 답변:

as_slice더 이상 사용되지 않습니다. 이제 특성을 사용해야 합니다.std::convert::AsRef대신:

match stringthing.as_ref() {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}

또한 catch-all 케이스를 명시적으로 처리해야 합니다.

다음과 같은 작업을 수행할 수 있습니다.

match &stringthing[..] {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}

그리고 또.as_str러스트 1.7.0 기준 방법:

match stringthing.as_str() {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}

당신은 또한 할 수 있습니다.

match &stringthing as &str {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}

참조:

편집자 참고 사항:이 답변은 Rust 1.0 이전 버전과 관련이 있으며 Rust 1.0에서는 작동하지 않습니다.

문자열 조각에 일치시킬 수 있습니다.

match stringthing.as_slice() {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}

시도할 수 있습니다.

fn main() {
    let stringthing = String::from("c");
    match &*stringthing {
        "a" => println!("0"),
        "b" => println!("1"),
        "c" => println!("2"),
        _ => println!("else")
    }
}

변환할 수 있습니다.String안으로&str다음 작업을 수행합니다.

fn main() {
    let stringthing = String::from("c");
    match &stringthing[..] {
        "a" => println!("0"),
        "b" => println!("1"),
        "c" => println!("2"),
    }
}

문자열에서 문자열 조각을 가져오려면 _str()로 사용

fn main() {
    let stringthing = String::from("c");
    match stringthing.as_str() {
        String::from("a") => println!("0"),
        String::from("b") => println!("1"),
        String::from("c") => println!("2"),
    }
}

콘솔에서 입력을 가져와 일치를 수행하려면 입력에서 이스케이프 문자인 '\n'을 제거하기 위해 as_str() 뒤에 trim()을 호출해야 합니다.에서 처럼

match stringthing.as_str().trim() {...}


as_str() 메서드를 사용하여 문자열을 &str로 변환한 다음 다음과 같이 &str 값을 일치시킬 수 있습니다.

fn main() {
    let stringthing = String::from("c");
    match stringthing.as_str() {
        "a" => println!("0"),
        "b" => println!("1"),
        "c" => println!("2"),
        _ => println!("other"),
    }
}

또는 String 값을 변수에 바인딩한 다음 다음과 같이 변수에 일치시킬 수 있습니다.

fn main() {
    let stringthing = String::from("c");
    match stringthing {
        ref x if x == "a" => println!("0"),
        ref x if x == "b" => println!("1"),
        ref x if x == "c" => println!("2"),
        _ => println!("other"),
    }
}

또는 == 연산자를 사용하여 String 값을 다음과 같은 문자열 리터럴과 비교할 수 있습니다.

fn main() {
    let stringthing = String::from("c");
    if stringthing == "a" {
        println!("0");
    } else if stringthing == "b" {
        println!("1");
    } else if stringthing == "c" {
        println!("2");
    } else {
        println!("other");
    }
}

언급URL : https://stackoverflow.com/questions/25383488/how-to-match-a-string-against-string-literals

반응형