Pembangunan Waktu Proses: String tidak ditemukan dalam cakupan ini

Dec 18 2020

Masalah umum yang mungkin dialami pengembang media: mengembangkan palet khusus untuk menyimpan pemetaan ke dalam penyimpanan dengan tipe umum, seperti String. Sebagai contoh:

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

Saat membuat runtime, Anda mendapatkan error ini untuk setiap String:

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

Mengapa Stringstidak termasuk dalam ruang lingkup? Dan stdjenis karat lainnya ?

Jawaban

4 ShawnTabrizi Dec 18 2020 at 07:35

Kesalahan di sini tidak terkait dengan no_std, jadi Anda mungkin hanya perlu mengimpor Stringtipe untuk mendapatkan kesalahan yang sebenarnya dengan menggunakan string dalam waktu proses.

Masalah sebenarnya yang akan Anda temukan adalah bahwa Stringtidak dapat dikodekan oleh Parity SCALE Codec, yang jelas merupakan persyaratan untuk item penyimpanan apa pun (atau sebagian besar jenis yang ingin Anda gunakan) di runtime.

Jadi pertanyaannya adalah "Mengapa SKALA tidak dikodekan String"?

Ini karena pilihan. Secara umum, Stringadalah tipe yang sangat kompleks. Buku Rust menghabiskan seluruh bagian untuk membicarakan kompleksitas dari jenisnya.

Dengan demikian, ini dapat dengan mudah menjadi senjata pijakan dalam lingkungan runtime yang digunakan orang secara Stringtidak benar.

Selain itu, umumnya praktik yang buruk untuk menyimpannya Stringdi penyimpanan runtime. Saya pikir kita dapat dengan mudah setuju bahwa meminimalkan penggunaan penyimpanan dalam runtime adalah praktik terbaik, dan dengan demikian Anda hanya perlu memasukkan ke dalam item penyimpanan yang Anda butuhkan untuk dapat memperoleh konsensus dan transisi status dalam runtime Anda. Paling sering, Stringdata akan digunakan untuk metadata, dan penggunaan semacam ini bukanlah praktik terbaik.

Jika Anda melihat lebih dekat pada Substrat, Anda akan menemukan bahwa kami melanggar praktik terbaik ini lebih dari sekali, tetapi ini adalah keputusan yang kami buat secara eksplisit, dengan memiliki informasi yang tersedia untuk dapat mengevaluasi biaya / manfaat dengan benar.

Semua gabungan ini adalah mengapa Strings tidak diperlakukan sebagai objek kelas pertama pada waktu proses. Sebagai gantinya, kami meminta pengguna untuk menyandikan string menjadi byte, dan kemudian bekerja dengan array byte itu sebagai gantinya.