Tôi đang cố gắng sắp xếp một Vec<String>
bằng cách sử dụng một hàm quan trọng trả về tham chiếu đến các chuỗi trong vectơ. Một ví dụ giả tạo là để sử dụng chức năng nhận dạng như là chức năng quan trọng (trong đó tất nhiên là vô dụng, nhưng đó là ví dụ nhỏ để tái tạo vấn đề của tôi):Tại sao tôi không thể sử dụng một hàm quan trọng trả về tham chiếu khi sắp xếp một vectơ với sort_by_key?
fn key(x: &String) -> &String {
x
}
Ngay bây giờ cho items: Vec<String>
, tôi muốn để có thể làm
items.sort_by_key(key);
này cung cấp cho các lỗi sau:
error[E0271]: type mismatch resolving `for<'r> <fn(&std::string::String) -> &std::string::String {main::key} as std::ops::FnOnce<(&'r std::string::String,)>>::Output == _`
--> src/main.rs:19:11
|
19 | items.sort_by_key(key);
| ^^^^^^^^^^^ expected bound lifetime parameter, found concrete lifetime
|
= note: concrete lifetime that was found is lifetime '_#16r
tôi không hiểu tại sao tôi nhận được lỗi này, vì vậy tôi đã cố gắng để theo dõi này xuống. đầu tiên tôi thực hiện phiên bản riêng của tôi về sort_by_key()
:
fn sort_by_key<T, K: Ord>(a: &mut [T], key: fn(&T) -> K) {
a.sort_by(|x, y| key(x).cmp(&key(y)));
}
Khi cố gắng để gọi chức năng này, tôi nhận được những gì trông giống như lỗi "ngược":
error[E0308]: mismatched types
--> src/main.rs:22:29
|
22 | sort_by_key(&mut items, key);
| ^^^ expected concrete lifetime, found bound lifetime parameter
|
= note: expected type `fn(&std::string::String) -> _`
found type `fn(&std::string::String) -> &std::string::String {main::key}`
tôi có thể làm cho mã biên dịch này bằng cách sửa chữa các loại chìa khóa để &T
thay vì sử dụng các tham số chung K
, hoặc bằng cách sử dụng &K
thay vì K
như kiểu trả về cho hàm chính:
fn sort_by_key_v2<T: Ord>(a: &mut [T], key: fn(&T) -> &T) {
a.sort_by(|x, y| key(x).cmp(&key(y)));
}
fn sort_by_key_v3<T, K: Ord>(a: &mut [T], key: fn(&T) -> &K) {
a.sort_by(|x, y| key(x).cmp(&key(y)));
}
Tôi cũng đã thử thêm chú thích trọn đời, nhưng điều đó chỉ thay đổi lỗi xung quanh mà không giải quyết lỗi đó.
Here's the three versions of the sort_by_key()
function on the Playground.
Tại sao tôi gặp phải các lỗi này? Có cách nào để sửa chữa chúng trong khi vẫn giữ loại khóa K
hoàn toàn chung chung không?
Tôi khuyên bạn nên đặt lại câu hỏi để tránh một điều tra quan trọng như vậy. Ngoài ra, bạn có thể cung cấp một MCVE về nỗ lực đầu tiên của bạn, tốt hơn là một cái gì đó tái tạo vấn đề trong Rust Playground? –
@ E_net4 Tôi đã thêm liên kết sân chơi và chỉ cần xóa câu hỏi cuối cùng. Tôi nghĩ rằng nó hoàn toàn chấp nhận được để hỏi nhiều hơn một câu hỏi trong một bài miễn là chúng phụ thuộc vào nhau. –
@ E_net4 Tôi đã theo dõi lời khuyên của bạn và xóa bỏ điều tra. Câu hỏi của tôi về cơ bản là lý do tại sao tôi nhận được các lỗi và cách khắc phục chúng. –