Tôi có đoạn mã này, trong đó tôi cần tìm ra loại giá trị được mã hóa và tôi không biết đó là Chuỗi, số nguyên không dấu hay Vector của Chuỗi. Tôi nghĩ đến việc thực hiện như sau:
Tôi có một đoạn mã cần xác định loại giá trị được mã hóa nhưng tôi không biết đó là chuỗi, số nguyên không dấu hay vectơ của chuỗi. Tôi muốn làm những việc sau:
trong khi hãy để Some(pair) = dict_dec.next_pair()? {
cặp đấu {
...
// &[u8] Đối tượng<'_, '_>
(trường không xác định, giá trị) => {
hãy để field_name = String::from_utf8_lossy(trường không xác định).to_string();
hãy để value_as_string: String = khớp với String::decode_bencode_object(value) {
Được(s) => s,
Err(_) => khớp với u64::decode_bencode_object(giá trị) {
Được(u) => u.to_string(),
Err(_) => khớp với Vec::::decode_bencode_object(giá trị) {
Ok(v) => v.join(", "),
Err(_) => "Giá trị không xác định".to_string(),
},
},
};
cho tuple: (String, String) = (field_name, value_as_string);
......
}
}
Tuy nhiên giá trị
từ thùng uốn cong không thể triển khai Sao chép, nó được di chuyển sau khi gọi giải mã_bencode_object
, Và giải mã_bencode_object
không tham chiếu. Có cách nào tôi có thể gọi nó nhiều lần, tạo một bản sao hoặc một cách tiếp cận khác để có được kết quả tương tự không?
Tuy nhiên, giá trị từ thùng bị uốn cong không thể sao chép được, nó được di chuyển sau khi gọi Decode_Bencode_Object và Decode_Bencode_Object không chấp nhận tham chiếu. Có cách nào để tôi có thể gọi nó nhiều lần để tạo một bản sao hay cách khác để tôi nhận được kết quả tương tự không?
Thêm câu trả lời
Tôi không biết chương trình giải mã phức tạp này có liên quan gì đến việc sao chép, nhưng để trả lời câu hỏi trong tiêu đề, u32
, Sợi dây
, Và Vector
tất cả thực hiện Dòng vô tính
, nghĩa là bạn có thể gọi .dòng vô tính()
để sao chép chúng. Lệnh gọi phải rõ ràng, vì việc sao chép vectơ và chuỗi phức tạp hơn so với việc sao chép bit đơn thuần, do đó Rust không muốn việc này diễn ra ở chế độ ẩn.
Tôi không biết sơ đồ giải mã phức tạp này có liên quan gì đến việc sao chép, nhưng để trả lời câu hỏi tiêu đề, u32, chuỗi và vectơ<字符串>Cả hai đều triển khai Clone, nghĩa là bạn có thể gọi .Clone() để sao chép chúng. Cuộc gọi phải rõ ràng vì việc sao chép vectơ và chuỗi phức tạp hơn việc sao chép bit đơn giản, vì vậy Rust không muốn nó diễn ra ở hậu trường.字符串>
Tôi không cố sao chép u32, String hay Vector, nhưng giá trị biến mà tôi sử dụng làm đối số cho decode_bencode_object. value là một đối tượng từ bendy crate và không triển khai sao chép, tuy nhiên tôi muốn truyền nó ba lần làm đối số để thử giải mã nó thành String, int hoặc Vector.
Tôi không cố sao chép u32, chuỗi hoặc vectơ mà thay vào đó là giá trị biến tôi đang sử dụng làm đối số DECODE_BENCODE_OBJECT. Giá trị là một đối tượng từ thùng cong và không thực hiện sao chép, nhưng tôi muốn chuyển nó dưới dạng tham số ba lần để cố gắng giải mã nó dưới dạng chuỗi, số nguyên hoặc vectơ.
Tôi nghĩ sẽ hữu ích nếu bạn chỉnh sửa câu hỏi của mình để bao gồm thông báo lỗi đầy đủ mà bạn thấy khi thử cách này và thông tin về thư viện này giải mã_bencode_object
chức năng thuộc về, do đó, vấn đề và những hạn chế của giải pháp có thể trở nên rõ ràng hơn.
Tôi nghĩ sẽ hữu ích nếu chỉnh sửa câu hỏi của bạn để bao gồm thông báo lỗi đầy đủ mà bạn thấy khi thử điều này, cũng như thông tin về thư viện mà hàm giải mã_bencode_Object này thuộc về thư viện nào, để bạn có thể hiểu rõ hơn vấn đề là gì và giải pháp có thể là gì.
Khuyến nghị câu trả lời tuyệt vời
Tôi suy ra từ câu hỏi của bạn rằng bạn đang sử dụng cái TừBencode
đặc điểm từ thùng uốn cong
và do đó các giá trị này thuộc loại Sự vật
. Từ TừBencode
chiếm quyền sở hữu của Sự vật
nó đã được đưa ra, bạn không thể tiếp tục sử dụng giá trị
sau khi bạn đã chuyển nó cho một kiểu triển khai đặc điểm này.
Tôi suy ra từ câu hỏi của bạn rằng bạn đang sử dụng tính năng FromBencode trong Crate Bendy, vì vậy các giá trị thuộc loại Object. Vì FromBencode nắm quyền sở hữu đối tượng mà nó chỉ định nên bạn không thể tiếp tục sử dụng nó sau khi chuyển một giá trị cho việc triển khai đặc điểm của một loại.
Thay đổi nhỏ nhất từ chương trình hiện tại của bạn sẽ là gọi dòng vô tính
phương pháp để tạo một bản sao sâu của bạn Sự vật
cho mỗi cuộc gọi đến giải mã_bencode_object
. Điều đó có nghĩa là bạn sẽ di chuyển bản sao vào phương thức và do đó bạn sẽ giữ quyền sở hữu đối tượng gốc. Tuy nhiên, bạn sẽ phải trả chi phí sao chép Sự vật
có thể có giá trị gấp nhiều lần, vì vậy bạn nên cân nhắc xem chi phí đó có chấp nhận được cho trường hợp sử dụng của bạn hay không.
Thay đổi tối thiểu so với chương trình hiện tại là gọi phương thức sao chép để tạo một bản sao sâu của đối tượng cho mỗi lệnh gọi tới giải mã_bencode_Object. Điều này có nghĩa là bạn sẽ di chuyển bản sao vào phương thức, do đó bạn sẽ giữ quyền sở hữu đối tượng ban đầu. Tuy nhiên, bạn có thể phải trả chi phí sao chép giá trị đối tượng nhiều lần, vì vậy bạn nên xem xét liệu chi phí đó có thể chấp nhận được đối với trường hợp sử dụng của mình hay không.
Một khả năng khác là quyết định loại nào sẽ thử trước khi bạn gọi phương thức đặc điểm. Tôi không quen thuộc với thư viện này nên tôi đoán một chút nhưng có vẻ như bạn có thể đưa ra một số suy luận dựa trên biến thể nào Đối tượng enum
được chọn như thế này:
Một khả năng khác là quyết định nên thử loại nào trước khi gọi phương thức đặc điểm. Tôi không quen với thư viện này nên tôi đoán một chút, nhưng có vẻ như bạn có thể đưa ra một số suy luận dựa trên biến thể của đối tượng enum mà bạn chọn, như sau:
khớp &giá trị {
Đối tượng::Byte(_) => {
// sử dụng String::decode_bencode_object
}
Đối tượng::Số nguyên(_) => {
// sử dụng u64::decode_bencode_object
}
Đối tượng::Danh sách(_) => {
// sử dụng Vec::::decode_bencode_object
}
}
Các cuộc thi đấu
biểu thức sử dụng một vay mượn của giá trị
để bạn có thể giữ quyền sở hữu nó để sử dụng bên trong mỗi một trong ba cánh tay phù hợp. Mỗi cánh tay chỉ cần gọi một giải mã_bencode_object
phương pháp, vì vậy điều này có thể chấp nhận được miễn là bạn không cố gắng sử dụng giá trị
một lần nữa sau khi cuộc thi đấu
khối.
Biểu thức so khớp sử dụng việc mượn một giá trị để bạn có thể giữ quyền sở hữu giá trị đó để sử dụng trong mỗi nhánh trong số ba nhánh so khớp. Chỉ cần gọi một phương thức Decode_Bencode_Object cho mỗi ARM, vì vậy, miễn là bạn không cố gắng sử dụng lại VALUE sau khối Match, điều này có thể chấp nhận được.
Thêm câu trả lời
Tôi là một lập trình viên xuất sắc, rất giỏi!