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

  • any_identifier#, any_identifier"...", any_identifier'...' ve 'any_identifier# artık ayrılmış söz dizimidir ve artık ayrı token’lara bölünmez.
  • Bu değişiklik en çok makroları ilgilendirir. Örneğin quote!{ #a#b } artık kabul edilmez.
  • Anahtar kelimelere özel davranılmaz; örneğin match"..." {} da artık kabul edilmez.
  • Hata almamak için tanımlayıcı ile onu izleyen #, " ya da ' arasında boşluk bırakın.
  • Sürüm taşıma araçları bu tür durumlarda boşluk eklemenize yardımcı olur.

Ayrıntılar

Gelecekte yeni sözdizimlerine yer açmak için önekli tanımlayıcılar, sabitler ve ömürler için bazı biçimleri ayırmaya karar verdik: prefix#identifier, prefix"string", prefix'c', prefix#123 ve 'prefix#. Buradaki prefix herhangi bir tanımlayıcı olabilir. Elbette b'...' gibi zaten anlamı olan önekler ve r"..." gibi ham dizgiler bunun dışındadır.

Bu sayede gelecekte, yeni bir sürüm sınırı gerektirmeden üzerine genişleyebileceğimiz bir sözdizimi alanı elde etmiş oluyoruz. Bunu bir sonraki sürüme kadar geçici bir sözdizimi için ya da uygun görülürse kalıcı bir sözdizimi için kullanabiliriz.

Bir sürüm sınırı olmasaydı bu değişiklik kırıcı olurdu; çünkü makrolar şu anda hello"world" gibi sözdizimlerini iki ayrı token olarak, yani hello ve "world" şeklinde kabul edebiliyor. Neyse ki otomatik düzeltme basittir: araya boşluk eklemek yeterlidir, yani hello "world". Aynı şekilde prefix#ident, prefix #ident olmalıdır. Sürüm taşıma araçları bu düzeltmeye yardımcı olur.

Bu biçimlerin artık tokenlaştırma hatası üretmesi dışında, RFC henüz hiçbir öneke özel bir anlam atamaz. Belirli öneklere anlam verilmesi gelecekteki önerilere bırakılmıştır. Bu önekleri şimdiden ayırdığımız için, ileride böyle anlamlar eklemek kırıcı değişiklik sayılmayacaktır.

Gelecekte görebileceğimiz olası bazı yeni önekler şunlardır; gerçi henüz hiçbiri için kesin karar verilmiş değildir:

  • k#keyword: Geçerli sürümde henüz anahtar kelime olmayan sözcükleri yazabilmek için. Örneğin async, 2015 sürümünde anahtar kelime değilken k#async biçimi, async sözcüğünü anahtar kelime olarak ayırmak için 2018 sürümünü beklemeden kullanılabilirdi.

  • f"": biçim dizgisi için bir kısayol. Örneğin f"hello {name}", eşdeğer format!() çağrısının kısa yazımı olabilir.

  • s"": String sabitleri için.

Taşıma

2021 sürümünün bir parçası olarak, Rust 2018 kod tabanlarını Rust 2021’e otomatik taşımaya yardımcı olmak için rust_2021_prefixes_incompatible_syntax lint’i eklendi.

Kodunuzu Rust 2021 ile uyumlu hale getirmek için şunu çalıştırın:

cargo fix --edition

Kodunuzu elle taşımak isterseniz ya da buna ihtiyaç duyarsanız süreç oldukça düzdür.

Şöyle tanımlanmış bir makronuz olduğunu düşünelim:

#![allow(unused)]
fn main() {
macro_rules! benim_makrom {
    ($a:tt $b:tt) => {};
}
}

Rust 2015 ve 2018’de, ilk token ağacı ile ikincisi arasına boşluk koymadan bu makroyu şu şekilde çağırmak geçerlidir:

benim_makrom!(z"hey");

Bu z öneki Rust 2021’de artık kabul edilmez. Bu yüzden makroyu çağırmak için önekten sonra şu şekilde bir boşluk eklemeniz gerekir:

benim_makrom!(z "hey");