2015-05-31 34 views
8

Tôi cần phải tìm một chỉ số của một phần tử trong một vector của chuỗi, đây là những gì tôi có cho đến nay:tìm chỉ số của một phần tử trong vector

fn main() { 
    let test: Vec<String> = vec!["one".to_string(), "two".to_string(), "three".to_string()]; 
    let index: i32 = test.iter().enumerate().find(|&r| r.1.to_string() == "two".to_string()).unwrap().0; 
} 

nó sản xuất một lỗi

error: mismatched types: 
expected `i32`, 
    found `usize` 
(expected i32, 
    found usize) [E0308] 
let index: i32 = test.iter().enumerate().find(|&r| r.1.to_string() == "two".to_string()).unwrap().0; 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

Tôi cho rằng đó là vì enumerate() trả về một bộ gồm <usize, _> (sửa tôi nếu tôi sai), nhưng làm cách nào để chuyển đổi usize thành i32 tại đây? Ngoài ra, nếu có một cách tiếp cận tốt hơn, tôi mở để gợi ý.

+0

FYI, nhỏ nitpick - tuples là '(A, B)', không phải ' '. – mdup

Trả lời

9

Không, đó là vì chỉ mục là usize, không phải i32. Trên thực tế, i32 hoàn toàn không phù hợp cho mục đích này; nó có thể không đủ lớn và không có lý do gì để nó được ký. Chỉ cần sử dụng usize.

Một số lưu ý khác: gọi to_string() không miễn phí và bạn không cần nó để so sánh; bạn có thể so sánh các lát chuỗi tốt!

Ngoài ra, nếu bạn thực sự muốn biến một usize thành một i32, bạn có thể làm điều đó với một dàn diễn viên: x as i32, mặc dù điều này sẽ không tạo ra một lỗi trên quá mức hoặc dưới dòng chảy (tức kết quả có thể âm).

Tất cả những gì đã nói, như đã nêu trong câu trả lời của Mathieu David, có phương pháp position trên trình lặp mà thực hiện những gì bạn muốn.

+0

Cảm ơn, nhưng tôi cần 'i32' (quá đủ cho trường hợp của tôi) và điều này vẫn tạo ra' usize'. Một điều nữa là tôi vẫn cần phải làm 'test.position_elem (" hai ".to_string());' bởi vì đây là một ví dụ đơn giản và những gì tôi thực sự làm việc là 'Vec ' - kết quả của tệp csv đã đọc tiêu đề với 'csv' crate. – Caballero

+0

Được quản lý để thích ứng với mã có liên quan thành 'usize', nhưng không thể tránh được bit' to_string() 'hoặc ít nhất là tôi không biết làm thế nào. – Caballero

+1

@Caballero Sử dụng tối thiểu 'test.position_elem (" hai ".into())' hoặc even'test.iter(). Position (| r | r == "two") '. – Veedrac

17

Tôi nghĩ bạn nên xem phương pháp position.

fn main() { 
    let test = vec!["one", "two", "three"]; 
    let index = test.iter().position(|&r| r == "two").unwrap(); 
    println!("{}", index); 
} 

Bạn có thể test it here.

Lưu ý rằng điều này làm việc cho bất kỳ trình lặp nào, vì vậy nó có thể được sử dụng cho các vectơ, mảng và lát, tất cả đều tạo ra các trình vòng lặp.

+0

Bạn nói đúng, tôi sẽ sửa câu trả lời của tôi. Cảm ơn bạn đã chỉ ra rằng :) –

Các vấn đề liên quan