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


205

StringRust에서 어떻게 일치시키는 지 알아 내려고 노력 중 입니다.

처음에 이와 같이 일치를 시도했지만 Rust가에서에서 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"),
    }
}

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

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

StringRust에서 s 를 실제로 일치시키는 방법은 무엇입니까?


stringthing.as_str()아마도 모든 대답 중에서 가장 간단 할 것입니다. 내가 좋아하지 않는 as_ref이 버그가 발생할 수있는 불필요한 일반, 그리고 같은 명시되지 때문에, 완전히 그 분명하지 않다 as_ref()될 것입니다 &str, as_str간단하고 분명하다.
Zorf

@Zorf 당신이 맞아요. as_str아직 존재하지 않을 때 대답이 받아 들여 졌습니다. 수락 된 답변을 변경했지만이 질문에 답변 한 모든 사람에게 감사합니다!
Jeroen

답변:


82

다음과 같이 할 수 있습니다 :

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

as_strRust 1.7.0부터 방법 이 있습니다 .

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

190

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

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

포괄 사건도 명시 적으로 처리해야합니다.


3
녹 1.4.0을 사용하면 trim()기능을 사용할 수 있습니다 . 사용하는 as_ref()것이 문자열과 일치하지 않습니다.
futtetennista

1
공백이 trim()제거 되어 일치하지 않는 것 같습니다 . 이것은 사용자 입력과 일치하도록 연기하는 데 좋습니다.
Gerard Sexton

1
작동하지 않습니다. read_line에서 String을 얻는 경우에만 _와 일치 할 수 있습니다.
Masked Man

녹이 다른 유형의 문자열을 관리하는 방법에 대해 많이 모르지만 기본 예제에서 작동하는 것 같습니다 .
tforgione


10

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

문자열 슬라이스에서 일치시킬 수 있습니다.

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

.as_ref()또는 을 사용하는 것이 더 좋으며 .as_str()둘 다 소유권을 가지지 않았습니다.
Abrar Khan

1

당신은 시도 할 수 있습니다:

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

2
&*stringthing의미와 역할 을 설명하면 답변의 유용성을 향상시킬 수 있습니다 .
세스 디 플리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.