Konteks dan cakupan
Sebuah tim sedang memindahkan beberapa crate dari Rust 2021 ke Rust 2024. Fungsi, modul, field, dan output makro menggunakan pengidentifikasi gen; Rust 2024 mereservasinya sebagai kata kunci, sehingga beberapa crate gagal selama penguraian (parsing). Rancang deteksi, perbaikan, gerbang CI, dan rollback.
Fokus pada migrasi edisi. Jangan berasumsi bahwa blok gen sudah stabil, dan pisahkan peningkatan compiler dari peralihan edisi.
Hal yang diuji oleh pewawancara
- Menjelaskan bahwa edisi mengubah aturan parsing sementara crate dari edisi yang berbeda masih dapat saling bergantung satu sama lain.
- Menggunakan lint
keyword_idents_2024dancargo fix --editionuntuk menemukan pengidentifikasigen. - Mempertimbangkan penggantian nama (renaming) dibandingkan raw identifier untuk kompatibilitas.
- Mencakup makro, API publik, build script, pengujian, dan dependensi workspace.
Pertanyaan klarifikasi
- Edisi, MSRV, dan toolchain apa yang digunakan setiap crate?
- Apakah
genmuncul di API publik, nama yang diserialisasi, atau antarmuka makro eksternal? - Apakah token yang terdampak berasal dari kode sumber, proc macro, atau build script?
- Apakah migrasi harus mendukung Rust 2021 dan 2024 secara bersamaan?
- Bisakah CI menjalankan kedua edisi di seluruh kombinasi fitur?
Jawaban 30 detik
“Saya menginventarisasi edisi workspace, toolchain, dan setiap sumber gen, lalu mengaktifkan keyword_idents_2024. Saya mengganti nama simbol internal; jika API publik harus mempertahankan ejaan tersebut, saya menggunakan raw identifier r#gen dan memverifikasi pemanggil di kedua edisi. Saya menjalankan cargo fix --edition untuk perubahan mekanis, meninjau makro dan antarmuka publik, memperbarui manifes Cargo secara manual, dan menjalankan check, test, docs, serta lint di Rust 2021, Rust 2024, dan matriks fitur lengkap. Setiap crate dimigrasikan dalam urutan dependensi dengan commit yang dapat dibatalkan dan laporan kompatibilitas.”
Desain langkah demi langkah
1. Pisahkan perubahan compiler dan edisi
Compiler dapat membangun edisi yang lebih lama; sebuah edisi memilih aturan parsing untuk suatu crate. Kunci (pin) toolchain dan lockfile, buat dasar acuan (baseline) Rust 2021, dan ubah kolom edition satu per satu untuk setiap crate. Hal ini mencegah perubahan compiler, dependensi, dan bahasa tersembunyi dalam satu diff yang sama.
2. Temukan setiap sumber gen
Aktifkan keyword_idents_2024 agar pengidentifikasi yang valid di edisi lama tetapi berkonflik di 2024 dilaporkan. Pencarian statis harus dilengkapi dengan ekspansi makro, token proc-macro, build script, dan pengujian. Perbaiki templat sebelum kode yang dihasilkan alih-alih mengedit output yang dihasilkan.
3. Pilih penggantian nama atau raw identifier
Ganti nama fungsi internal, variabel lokal, dan modul untuk meningkatkan kejelasan jangka panjang. Jika API publik, nama yang diserialisasi, atau panggilan lintas-crate harus mempertahankan gen, raw identifier menjaga simbol tetap dapat dialamatkan di edisi yang diperlukan. Perlakukan itu sebagai jembatan migrasi, bukan alasan untuk mempertahankan nama internal yang membingungkan selamanya.
pub fn r#gen() -> IteratorType {
// implementation
}
fn call() {
let _items = r#gen();
}4. Otomatiskan perbaikan dengan peninjauan
cargo fix --edition menaikkan lint yang relevan menjadi peringatan dan menerapkan saran compiler seperti mengubah gen menjadi r#gen. Alat ini tidak dapat menentukan penamaan produk atau kebijakan API dan tidak boleh menimpa pekerjaan yang belum di-commit. Jalankan pada branch yang bersih, tinjau diff makro, doctest, kode yang dihasilkan, dan API publik, lalu perbarui edisi manifes secara manual.
5. Verifikasi batas edisi
Crate dari edisi yang berbeda dapat ditautkan, jadi migrasikan crate workspace secara bertahap. CI harus menjalankan cargo check, cargo test, cargo doc, clippy, dan kombinasi fitur untuk 2021 dan 2024. Tambahkan contoh waktu kompilasi untuk API publik agar pemanggil tidak mengalami regresi karena raw identifier atau penggantian nama.
6. Amati, kelompokkan, dan batalkan (roll back)
Catat temuan lint, edisi, toolchain, crate, fitur, sumber makro, dan pengujian yang gagal; jangan pernah mencatat kredensial atau input sensitif. Migrasikan leaf crate sebelum crate yang menjadi dependensi luas. Simpan tag lama, lockfile, dan build yang dapat direproduksi per kelompok (batch); jika downstream rusak, kembalikan batch tersebut alih-alih mencampur perbaikan parsial secara manual.
Contoh jawaban berkualitas tinggi
“Edisi mengubah aturan parsing, sementara peningkatan compiler adalah variabel terpisah, jadi saya mengunci toolchain dan menetapkan acuan dasar Rust 2021. Saya mengaktifkan keyword_idents_2024 dan menginventarisasi kode sumber, makro, proc macro, build script, dan pengujian yang menghasilkan gen. Simbol internal diganti namanya; API publik yang harus mempertahankan ejaan menggunakan r#gen, dengan pengujian serialisasi dan panggilan lintas-crate. Saya menjalankan cargo fix --edition, meninjau diff, memperbarui manifes, dan menjalankan check, test, docs, serta clippy di seluruh 2021, 2024, dan kombinasi fitur. Crate beralih dalam urutan dependensi, dengan telemetri lint dan kegagalan serta titik rollback yang dapat direproduksi.”
Kesalahan umum
- Hanya meningkatkan compiler → parsing edisi tidak pernah diverifikasi → kunci acuan dasar dan alihkan edisi secara terpisah.
- Hanya melakukan grep pada file sumber → makro atau kode yang dihasilkan masih memancarkan
gen→ lakukan lint pada sumber pembuatan token dan uji hasil ekspansi. - Mengubah setiap nama menjadi r#gen → keterbacaan API jangka panjang menurun → ganti nama internal dan simpan raw identifier hanya untuk batas kompatibilitas.
- Menerima cargo fix tanpa peninjauan → API publik atau dokumentasi dapat rusak → tinjau setiap diff dan jalankan CI lintas edisi.
- Mengalihkan seluruh workspace sekaligus → regresi downstream sulit ditemukan → migrasikan berdasarkan topologi dependensi dengan titik rollback.
Pertanyaan lanjutan dan tanggapan
Bisakah Rust 2024 langsung menggunakan blok gen?
gen direservasi untuk memberikan ruang sintaks bagi blok gen di masa mendatang. Migrasi tidak boleh berasumsi bahwa fitur tersebut sudah stabil; verifikasi dokumentasi toolchain dan status fitur saat ini.
Apakah raw identifier mengubah ABI atau nama yang diserialisasi?
Raw identifier terutama mengubah cara parser membaca suatu nama. Apakah ABI, refleksi, serialisasi, atau FFI berubah bergantung pada simbol publik dan generator sebenarnya, jadi verifikasi batasan-batasan tersebut. Lindungi protokol eksternal dengan nama wire eksplisit dan pengujian kompatibilitas.
Mengapa mengedit Cargo.toml setelah cargo fix?
cargo fix --edition menerapkan saran lint tingkat kode, tetapi kolom edisi tetap memerlukan konfirmasi dan commit yang disengaja. Tinjau perubahan manifes bersamaan dengan hasil pengujian agar tidak ada crate workspace yang dialihkan secara tidak sengaja atau terlewatkan.