Pembangunan Waktu Proses: String tidak ditemukan dalam cakupan ini
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 Strings
tidak termasuk dalam ruang lingkup? Dan std
jenis karat lainnya ?
Jawaban
Kesalahan di sini tidak terkait dengan no_std
, jadi Anda mungkin hanya perlu mengimpor String
tipe untuk mendapatkan kesalahan yang sebenarnya dengan menggunakan string dalam waktu proses.
Masalah sebenarnya yang akan Anda temukan adalah bahwa String
tidak 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, String
adalah 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 String
tidak benar.
Selain itu, umumnya praktik yang buruk untuk menyimpannya String
di 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, String
data 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 String
s 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.