Saya tidak mengerti kesalahannya cannot move out of borrowed content
. Saya telah menerimanya berkali-kali dan saya selalu menyelesaikannya, tetapi saya tidak pernah mengerti mengapa.
Sebagai contoh:
for line in self.xslg_file.iter() {
self.buffer.clear();
for current_char in line.into_bytes().iter() {
self.buffer.push(*current_char as char);
}
println!("{}", line);
}
menghasilkan kesalahan:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:31:33
|
31 | for current_char in line.into_bytes().iter() {
| ^^^^ cannot move out of borrowed content
Di versi Rust yang lebih baru, kesalahannya adalah
error[E0507]: cannot move out of `*line` which is behind a shared reference
--> src/main.rs:31:33
|
31 | for current_char in line.into_bytes().iter() {
| ^^^^ move occurs because `*line` has type `std::string::String`, which does not implement the `Copy` trait
Saya menyelesaikannya dengan kloning line
:
for current_char in line.clone().into_bytes().iter() {
Saya tidak memahami kesalahan bahkan setelah membaca posting lain seperti:
- Tidak dapat meminjam File dari & mut self (pesan kesalahan: tidak dapat keluar dari konten pinjaman)
- Mengubah node di pohon di Rust
Dari mana asal mula kesalahan semacam ini?
.bytes()
metode.).as_bytes()
as_bytes()
tanpa kloning. Tapi saya masih tidak mengerti kenapa?String
mendapatkanbytes
metode daristr
.Jawaban:
Mari kita lihat tanda tangannya untuk
into_bytes
:Ini membutuhkan
self
, bukan referensi ke self (&self
). Itu berarti ituself
akan dikonsumsi dan tidak akan tersedia setelah panggilan. Sebagai gantinya, Anda mendapatkan fileVec<u8>
. Awalaninto_
adalah cara umum untuk menunjukkan metode seperti ini.Saya tidak tahu persis apa
iter()
yang dikembalikan metode Anda , tetapi tebakan saya adalah bahwa ini adalah iterator berakhir&String
, yaitu, mengembalikan referensi keString
tetapi tidak memberi Anda kepemilikan darinya. Itu berarti Anda tidak dapat memanggil metode yang menggunakan nilainya .Seperti yang Anda temukan, salah satu solusinya adalah menggunakan
clone
. Hal ini menciptakan duplikat objek yang Anda lakukan sendiri, dan dapat menghubungiinto_bytes
di. Seperti yang disebutkan oleh pemberi komentar lainnya, Anda juga dapat menggunakanas_bytes
yang mengambil&self
, sehingga akan berfungsi pada nilai pinjaman. Yang mana yang harus Anda gunakan bergantung pada tujuan akhir Anda untuk apa yang Anda lakukan dengan penunjuk.Dalam gambaran yang lebih besar, ini semua berkaitan dengan gagasan tentang kepemilikan . Operasi tertentu bergantung pada kepemilikan item, dan operasi lain dapat lolos dengan meminjam objek (mungkin saling bergantian). Referensi (
&foo
) tidak memberikan kepemilikan, ini hanya pinjaman.Mentransfer kepemilikan adalah konsep yang berguna secara umum - ketika saya selesai dengan sesuatu, orang lain mungkin memilikinya. Di Rust, ini adalah cara untuk menjadi lebih efisien. Saya dapat menghindari mengalokasikan salinan, memberi Anda satu salinan, kemudian membuang salinan saya. Kepemilikan juga merupakan keadaan yang paling permisif; jika saya memiliki suatu benda, saya dapat melakukannya sesuai keinginan.
Berikut kode yang saya buat untuk diuji:
sumber