Halo, Habr! Saya mempersembahkan kepada Anda terjemahan artikel "Tim Rilis Karat" Mengumumkan Karat 1.34.0 " .
Tim pengembangan Rust dengan bangga mengumumkan rilis versi baru Rust, 1.34.0. Rust adalah bahasa pemrograman yang memungkinkan semua orang membuat perangkat lunak yang andal dan efisien.
Jika Anda memiliki versi Rust sebelumnya yang diinstal menggunakan rustup, maka untuk meningkatkan versi Rust ke versi 1.34.0 Anda hanya perlu melakukan:
$ rustup update stable
Jika Anda belum menginstal rustup, Anda dapat menginstalnya dari halaman yang sesuai di situs web kami.
Apa yang termasuk dalam versi stabil 1.34.0
Peningkatan utama untuk rilis ini adalah dukungan untuk pendaftar kargo alternatif. Apakah rilis ini juga menyertakan dukungan ?
dalam tes dokumentasi, beberapa peningkatan dalam #[attribute(...)]
dan stabilisasi TryFrom
. Baca tentang hal-hal penting atau lihat catatan rilis terperinci untuk informasi lebih lanjut.
Registrasi cargo
alternatif
Sebelum versi 1.0, Rust memiliki registry publik, crates.io . Orang-orang menerbitkan peti menggunakan cargo publish
dan dengan mudah menghubungkan peti ini di bagian [dependencies]
Cargo.toml
.
Namun, tidak semua orang ingin mempublikasikan peti mereka di crates.io. Orang yang mendukung proyek sumber tertutup tidak dapat menggunakan crates.io, dan sebagai gantinya mereka harus menentukan git
atau path
dalam dependensi. Tidak ada yang seperti ini untuk proyek-proyek kecil, tetapi jika organisasi Anda memiliki banyak peti sumber tertutup, Anda kehilangan manfaat dari dukungan versi, yang tersedia di crates.io.
Dimulai dengan rilis ini, Cargo dapat mendukung pendaftar alternatif. Registri ini hidup berdampingan dengan crates.io, sehingga Anda dapat menulis program yang bergantung pada crates.io dan registri Anda. Namun, subracks crates.io tidak dapat bergantung pada registri eksternal.
Untuk menggunakan pendaftar alternatif, Anda harus menambahkan baris berikut ke .cargo/config
. File ini bisa di direktori home Anda ( ~/.cargo/config
) atau di direktori paket.
[registries] my-registry = { index = "https://my-intranet:8080/git/index" }
Menambahkan ketergantungan dari registri alternatif itu mudah. Saat Anda menentukan ketergantungan pada Cargo.toml
, gunakan kunci registry
agar Cargo tahu bahwa Anda ingin menerima peti dari registri alternatif:
[dependencies] other-crate = { version = "1.0", registry = "my-registry" }
Sebagai penulis peti, jika Anda ingin menerbitkan peti Anda di registri alternatif, hal pertama yang perlu Anda lakukan adalah menyimpan token otentikasi di ~/.cargo/credentials
menggunakan perintah cargo login
:
cargo login --registry=my-registry
Selanjutnya, Anda dapat menggunakan flag --registry
untuk menentukan registri tempat rak akan diterbitkan:
cargo publish --registry=my-registry
Tentang bagaimana Anda dapat menjalankan registri Anda sendiri, Anda dapat menemukannya di dokumentasi .
?
dalam tes dokumentasi
Apakah RFC 1937 mengusulkan untuk menambah dukungan operator ?
dalam fungsi fn main()
, #[test]
dan tes dokumentasi, yang memungkinkan mereka mengembalikan Option<T>
atau Result<T, E>
mana opsi dengan kesalahan menghasilkan kode terminasi yang tidak nol dalam kasus fn main()
atau tes yang jatuh dalam kasus tes .
Dukungan dalam fn main()
dan #[test]
diimplementasikan untuk waktu yang lama . Namun, dukungan dalam tes dokumentasi terbatas pada tes di mana fn main()
hadir secara eksplisit.
?
dukungan penuh ditambahkan dalam rilis ini ?
dalam tes dokumentasi. Sekarang Anda dapat menulis dalam tes dokumentasi Anda ini:
Di bagian bawah tes dokumentasi, Anda masih perlu menunjukkan jenis kesalahan yang akan digunakan.
Dukungan untuk aliran token khusus dalam atribut pengguna
Makro prosedural di Rust dapat mendefinisikan atribut pengguna yang mereka gunakan. Sampai sekarang, atribut-atribut ini telah terbatas pada path tree dan literal sesuai dengan sintaks berikut:
#[foo(bar)] #[foo = "bar"] #[foo = 0] #[foo(bar = true)] #[foo(bar, baz(quux, foo = "bar"))]
Tidak seperti macro prosedural, atribut tambahan ini tidak dapat menerima aliran token yang sewenang-wenang di pembatas, itulah sebabnya Anda tidak bisa menulis #[range(0..10)]
atau #[bound(T: MyTrait)]
. Racks dari macro prosedural malah menggunakan string untuk sintaksis seperti ini, misalnya #[range("0..10")]
.
Dengan rilis ini, atribut khusus #[attr($tokens)]
memungkinkan penggunaan token sewenang - wenang dalam $tokens
, cocok dengan mereka sesuai dengan makro. Jika Anda adalah penulis peti makro prosedural, harap periksa apakah string digunakan dalam sintaks atribut pengguna Anda dan apakah string dapat diganti dengan aliran token.
TryFrom
dan TryInto
Sifat TryFrom
dan TryInto
telah distabilkan untuk mendukung kesalahan konversi tipe.
Misalnya, from_be_bytes
dan metode terkait tipe integer menerima array, tetapi data sering dibaca melalui irisan. Konversi manual antara irisan dan array sangat membosankan. Dengan sifat-sifat baru, ini dapat dilakukan pada baris yang sama dengan .try_into()
.
let num = u32::from_be_bytes(slice.try_into()?);
Untuk konversi yang tidak dapat gagal, seperti u8
ke u32
, tipe Infallible
ditambahkan. Karena itu, TryFrom
secara otomatis diterapkan untuk semua yang menerapkan sifat From
. Di masa mendatang, kami berharap dapat membuat Infallible
alias untuk !
(tidak pernah) .
fn before_exec
digunakan lagi karena unsafe fn pre_exec
Pada sistem mirip Unix, CommandExt::before_exec
memungkinkan Anda untuk menjadwalkan penutupan sebelum exec
dipanggil.
Penutupan ini dilakukan dalam konteks proses anak setelah garpu. Ini berarti bahwa sumber daya, seperti deskriptor file dan area memori, dapat digandakan. Dengan kata lain, Anda bisa mendapatkan salinan nilai jenis non- Copy
dalam proses yang berbeda, sedangkan yang asli akan tetap di induknya. Ini dapat menyebabkan perilaku yang tidak terdefinisi dan merusak perpustakaan yang menyarankan tidak adanya duplikasi .
Oleh karena itu, fungsi before_exec
harus ditandai unsafe
. Dalam rilis ini, kami menandai fn before_exec
tidak digunakan lagi karena unsafe fn pre_exec
. Saat memanggil CommandExt::pre_exec
Anda perlu memastikan bahwa penutupan tidak melanggar invarian perpustakaan dengan membuat duplikat yang tidak valid. Jika Anda menyediakan perpustakaan yang berada dalam situasi yang sama before_exec
, pikirkan tentang keusangan dan berikan alternatif dengan unsafe
.
Stabilisasi perpustakaan
Dalam 1.34.0, himpunan bilangan bulat atom tipe bertanda dan tidak bertanda diperluas diperluas, dimulai dengan 8 bit ( AtomicU8
) dan berakhir dengan 64 bit.
NonZeroU8
unsigned integer seperti NonZeroU8
sebelumnya distabilkan. Berkat ini, Option<NonZeroU8>
berukuran sama dengan u8
. Versi yang ditandatangani seperti NonZeroI8
distabilkan dalam rilis ini.
Fungsi iter::from_fn
dan iter::successors
distabilkan. Yang pertama memungkinkan Anda membuat iterator dari FnMut() -> Option<T>
. Untuk mengambil elemen berulang-ulang dari vektor, Anda sekarang dapat menulis from_fn(|| vec.pop())
. Sementara itu, fungsi kedua menciptakan iterator baru, di mana setiap elemen selanjutnya dihitung berdasarkan yang sebelumnya.
Selain itu, API berikut telah distabilkan:
Lihat catatan rilis terperinci untuk detail lebih lanjut.