Bagaimana cara mengulangi array bilangan bulat?

Apa yang bisa saya lakukan untuk mengulangi array bilangan bulat di Rust?

fn main () {

    let mut array: Vec<i64> = vec![2];

    for k in range(3, 13195) {
        for p in array.iter() {
           if (k % p != 0) {array.push(p)};
        }        
    }
}

Memberi saya kesalahan kompiler:

Rustc "Task2_minimalcode.rs" (namanya: C:\Users\XXX\Documents\Rust - Project Euler)

Task2_minimalcode.rs:7:14: 7:15 error: tipe tidak cocok: diharapkan _, ditemukan &i64 (variabel integral yang diharapkan, ditemukan &-ptr) [E0308] Task2_minimalcode.rs:7 if (k % p != 0) {array .push(p)};
^ Task2_minimalcode.rs:7:34: 7:35 error: tipe tidak cocok: diharapkan i64, ditemukan &i64 (diharapkan i64, ditemukan &-ptr) [E0308]

Task2_minimalcode.rs:7 if (k % p != 0) {array.push(p)}; ^ error: dibatalkan karena 2 kesalahan sebelumnya. Gagal kompilasi.


person Vega    schedule 07.02.2015    source sumber


Jawaban (2)


Kutip pesan kesalahan:

error: mismatched types: expected i64, found &i64 (expected i64, found &-ptr)

Vec<T>::iter memberi Anda iterator di atas &T (referensi ke T). Jika Anda tidak ingin menggunakan vec lagi, Anda dapat menggunakan for p in array atau for p in array.into_iter(). Jika Anda ingin ingin menggunakannya lagi, Anda memiliki beberapa pilihan:

  • &array atau array.iter(), dan dereferensi p saat menggunakannya.
  • array.iter().cloned()
  • array.iter().map(|e| *e) (efektifnya sama seperti di atas)

Jika semua pembicaraan tentang referensi ini tidak masuk akal, Anda mungkin harus membaca bagian Rust Pesan tentang Pointer.

Ingatlah bahwa Anda dapat mengelabui kompiler agar memberi tahu Anda tipe variabel seperti: let _:() = p; -- pesan kesalahan akan berisi tipe sebenarnya.

person DK.    schedule 07.02.2015
comment
Saya membutuhkan vektor itu lagi. dereferensi p saat menggunakannya. Bagaimana aku melakukan itu? &p tidak berfungsi - person Vega; 07.02.2015
comment
&p mengambil referensi ke p, *p mendereferensi referensi p. Anda mungkin harus membaca Rust Book; Anda tidak akan melangkah terlalu jauh tanpa memahami referensi di Rust: referensi tersebut ada di mana-mana. - person DK.; 07.02.2015
comment
Saya tahu apa itu referensi/derefence, tetapi berasal dari kode terkelola (Java) saya kesulitan memutuskan kapan dan di mana menggunakannya :(. - person Vega; 07.02.2015
comment
Itulah sebabnya saya merekomendasikan buku ini; ini bukan tentang mengetahui apa itu secara abstrak, Anda perlu memahami bagaimana mereka digunakan. - person DK.; 07.02.2015

Saat Anda melakukan iterasi pada sebuah irisan (yang merupakan tampilan ke dalam Vec), Anda mendapatkan referensi ke item dalam vektor, bukan item itu sendiri.

Anda dapat memperbaikinya dengan dua cara yang setara.

// Mark the iteration variable as a reference
for &p in &array {
    if (k % p != 0) {
        array.push(p)
    };
}

// Dereference the iteration variable
for p in &array {
    if (k % *p != 0) {
        array.push(*p)
    };
}

Namun, kemudian Anda mengalami masalah berikutnya: Anda tidak dapat mengubah Vec saat Anda mengulanginya! Jika Anda diizinkan melakukannya, vektor mungkin perlu mengalokasikan ulang memori yang mendukungnya, yang kemudian akan membuat semua referensi di iterator menjadi tidak valid. Ini adalah nilai jual yang kuat dari Rust - ini mencegah Anda menembak diri sendiri seperti ini!

Tanpa mengetahui apa yang sebenarnya ingin Anda lakukan, berikut salah satu cara melakukannya:

fn main() {
    let input_array = vec![2u64];
    let mut output_array = input_array.clone();

    for k in 3..13195 {
        for &p in &input_array {
            if k % p != 0 {
                output_array.push(p)
            };
        }
    }
}

Lihat juga:

person Shepmaster    schedule 07.02.2015
comment
Tujuan saya adalah tugas proyek Euler 3 (projecteuler.net/problem=3), tetapi sepertinya saya perlu untuk mendapatkan algoritma yang lebih baik. Saya akan terlalu memikirkan program saya, terima kasih atas bantuan Anda :). - person Vega; 07.02.2015
comment
Sejauh yang saya mengerti, irisan akan menghasilkan nilai bertipe i32, benar? Saya ingin sepotong nilai usize, bagaimana cara menentukannya? - person Artyom Gevorgyan; 01.08.2020
comment
@ArtemHevorhian irisan mengembalikan nilai jenis apa pun. Dalam hal ini, nilainya adalah Vec<u64>, jadi subirisan dan nilai yang diindeks juga akan menggunakan u64. Ubah tipe irisan Anda untuk mengubah subirisan dan nilai yang diindeks. - person Shepmaster; 03.08.2020