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ğinasync, 2015 sürümünde anahtar kelime değilkenk#asyncbiçimi,asyncsö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ğinf"hello {name}", eşdeğerformat!()çağrısının kısa yazımı olabilir. -
s"":Stringsabitleri 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");