Çalışma Zamanı Oluşturma: Bu kapsamda dize bulunamadı

Dec 18 2020

Alt tabaka geliştiricilerinin karşılaşabileceği yaygın bir sorun: eşleştirmeyi String,. Örnek olarak:

#[derive(Encode, Decode, Clone, Default, RuntimeDebug)]
pub struct ClusterMetadata {
    ip_address: String,
    namespace: String,
    whitelisted_ips: String,
}

Çalışma zamanı oluştururken bu hatayı her biri için alırsınız String:

     |
  21 |     ip_address: String,
     |                 ^^^^^^ not found in this scope

Neden Stringskapsama dahil edilmiyor? Ve diğer stdpas türleri?

Yanıtlar

4 ShawnTabrizi Dec 18 2020 at 07:35

Buradaki hata bununla ilgili değildir no_std, bu nedenle muhtemelen Stringçalışma zamanında dizeleri kullanarak gerçek hataları almak için türü içe aktarmanız gerekir .

StringBulacağınız asıl sorun , çalışma zamanında herhangi bir depolama öğesi (veya kullanmak istediğiniz çoğu tür) için bir gereklilik olan Parity SCALE Codec tarafından kodlanamamasıdır.

Öyleyse soru şu: SCALE neden kodlamıyor String?

Bu seçim gereğidir. Genel Stringolarak şaşırtıcı derecede karmaşık bir tiptir. Rust kitabı, yazının karmaşıklığından bahseden bir bölüm geçiriyor .

Böylelikle insanların Stringyanlış kullandığı çalışma ortamında kolayca tabanca haline gelebilir .

Ayrıca, ' Stringleri çalışma zamanı depolamasında depolamak genellikle kötü bir uygulamadır . Çalışma zamanında depolama kullanımını en aza indirmenin en iyi uygulama olduğunu kolayca kabul edebileceğimizi düşünüyorum ve bu nedenle yalnızca çalışma zamanınızda fikir birliği ve durum geçişleri elde edebilmeniz için gereken depolama öğelerini koymalısınız. Çoğu zaman, Stringveriler meta veriler için kullanılır ve bu tür bir kullanım en iyi uygulama değildir.

Substrate'e daha yakından bakarsanız, bu en iyi uygulamayı bir kereden fazla ihlal ettiğimizi göreceksiniz, ancak bu, maliyeti / faydayı doğru bir şekilde değerlendirebilmek için elimizdeki bilgilere sahip olarak, açıkça verdiğimiz bir karardır.

Tüm bunların birleşimi, Strings'nin çalışma zamanında neden birinci sınıf nesne olarak değerlendirilmediğidir. Bunun yerine, kullanıcılardan dizeleri bayt olarak kodlamalarını ve bunun yerine bu bayt dizisiyle çalışmalarını istiyoruz.