Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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)]
}