Ayrılmış Söz Dizimi
Özet
#"foo"#biçimindeki öneksiz korumalı dizgiler gelecekteki kullanım için ayrılmıştır.- Art arda gelen iki ya da daha fazla
#karakteri gelecekteki kullanım için ayrılmıştır.
Ayrıntılar
RFC 3593, 2024 sürümünde öneki olmayan korumalı dizgi sabitleri için sözdizimini
ayırdı; böylece gelecekteki olası dil değişikliklerine yer açılmış oldu.
2021 sürümü, ident##"foo"## gibi önekli korumalı dizgiler için ayrılmış söz dizimini
zaten tanımlamıştı. 2024 sürümü bunu, ident öneki olmayan dizgileri de kapsayacak
şekilde genişletir.
İki ayrı ayrılmış sözdizimi vardır:
- Hemen ardından bir [dizgi sabiti] gelen bir ya da daha fazla
#karakteri. - Arada boşluk olmadan art arda gelen iki ya da daha fazla
#karakteri.
Bu ayırma işlemi, tokenlaştırma ve makrolarla etkileşim nedeniyle bir sürüm sınırında yapılıyor. Örneğin şu makroyu düşünün:
#![allow(unused)]
fn main() {
macro_rules! demo {
( $a:tt ) => { println!("tek token") };
( $a:tt $b:tt $c:tt ) => { println!("uc token") };
}
demo!("foo");
demo!(r#"foo"#);
demo!(#"foo"#);
demo!(###)
}
2024 sürümünden önce bu makro şu çıktıyı üretir:
tek token
tek token
uc token
uc token
2024 sürümünden itibaren #"foo"# satırı ile ### satırı artık derleme hatası
üretir; çünkü bu biçimler artık ayrılmıştır.
Taşıma
rust_2024_guarded_string_incompatible_syntax lint’i, ayrılmış sözdizimiyle
eşleşen token’ları tespit eder ve bunların ayrı ayrı ayrıştırılmaya devam
edebilmesi için gereken yerlere boşluk ekleyen bir değişiklik önerir.
Bu lint, otomatik sürüm taşımasına dahil olan rust-2024-compatibility grubunun
parçasıdır. Kodunuzu Rust 2024 ile uyumlu hale getirmek için şunu çalıştırın:
cargo fix --edition
Alternatif olarak, token’ları güncellemeniz gerekebilecek makro çağrılarını bulmak için lint’i elle etkinleştirebilirsiniz:
#![allow(unused)]
fn main() {
// Elle taşıma yapmak için bunu crate köküne ekleyin.
#![warn(rust_2024_guarded_string_incompatible_syntax)]
}