Làm cách nào để khớp Chuỗi với chuỗi ký tự trong Rust?


199

Tôi đang cố gắng tìm ra cách khớp với một Stringtrong Rust.

Ban đầu tôi đã thử kết hợp như thế này, nhưng tôi phát hiện ra Rust không thể ngầm chuyển từ std::string::Stringsang &str.

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

Điều này có lỗi:

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`

Sau đó tôi đã cố gắng xây dựng các Stringđối tượng mới , vì tôi không thể tìm thấy một hàm để truyền a Stringđến a &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"),
    }
}

Điều này đã cho tôi các lỗi sau 3 lần:

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

Làm thế nào để thực sự khớp Strings trong Rust?


stringthing.as_str()có lẽ là đơn giản nhất trong tất cả các câu trả lời; Tôi không thích as_refbởi vì nó không cần thiết chung chung, có thể dẫn đến lỗi và không rõ ràng, nó không hoàn toàn rõ ràng rằng as_ref()nó sẽ là một &str, as_strđơn giản và rõ ràng.
Zorf

@Zorf Bạn nói đúng. Câu trả lời đã được chấp nhận khi as_strchưa tồn tại. Tôi đã thay đổi câu trả lời được chấp nhận nhưng cảm ơn tất cả những người đã trả lời câu hỏi này!
Jeroen

Câu trả lời:


70

Bạn có thể làm một cái gì đó như thế này:

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

Ngoài ra còn có một as_strphương pháp như Rust 1.7.0:

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

189

as_slicekhông được dùng nữa, bây giờ bạn nên sử dụng đặc điểm này std::convert::AsRef:

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

Lưu ý rằng bạn cũng phải xử lý rõ ràng trường hợp bắt tất cả.


3
sử dụng rỉ sét 1.4.0 người ta có thể sử dụng trim()chức năng. Chỉ sử dụng as_ref()không khớp với chuỗi.
futtetennista

1
Tôi nghĩ rằng trận đấu thất bại vì khoảng trắng mà trim()loại bỏ. Điều này là tốt cho việc trì hoãn để phù hợp với đầu vào của người dùng.
Gerard Sexton

1
Nó không hoạt động. Nó chỉ có thể khớp với _ nếu tôi nhận được String từ read_line.
Người đàn ông đeo mặt nạ

Không biết nhiều về cách gỉ quản lý các loại chuỗi khác nhau, nhưng dường như nó hoạt động trên một ví dụ cơ bản .
tforgione


10

Lưu ý của biên tập viên: Câu trả lời này liên quan đến phiên bản Rust trước 1.0 và không hoạt động trong Rust 1.0

Bạn có thể kết hợp trên một lát cắt chuỗi.

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

tốt hơn để sử dụng .as_ref()hoặc .as_str(), cả hai đã không có quyền sở hữu.
Abrar Khan

1

Bạn co thể thử:

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

1
Nó có thể cải thiện tính hữu ích của câu trả lời của bạn nếu bạn giải thích ý &*stringthingnghĩa và việc làm.
Seth Difley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.