Кодирование структуры в строку в Rust
Когда у типа есть трейт сборки, значение можно записать в строку одной командой из крейта формата. Результат лежит в исходе: при успехе там готовая строка с объектом или массивом, при сбое ее не используют.
Перед сборкой подключают трейты через пометку над структурой и импортируют крейты в файле. Дальше достаточно передать ссылку на значение в команду превращения в строку.
Соберем пользователя с именем и возрастом:
use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize)]
struct User {
name: String,
age: i32,
}
fn main() {
let user = User {
name: String::from("ann"),
age: 20,
};
match serde_json::to_string(&user) {
Ok(text) => println!("{}", text),
Err(_) => println!("error"),
}
}
На экране {"name":"ann","age":20}.
Разбор через match отделяет удачную
строку от сбоя сборки.
Тот же прием работает для карты со строковым ключом без отдельной структуры:
use std::collections::HashMap;
use serde_json;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("a"), 1);
scores.insert(String::from("b"), 2);
match serde_json::to_string(&scores) {
Ok(text) => println!("{}", text),
Err(_) => println!("error"),
}
}
Дана структура:
struct Flag {
on: bool,
}
Подключите сборку, запишите значение
с полем on равным true
в строку и выведите ее через разбор
исхода.
Дана структура:
struct Pair {
left: i32,
right: i32,
}
Соберите строку для пары 3 и
4 и скажите, какие ключи появятся
в объекте.
Скажите, какой тип возвращает команда превращения структуры в строку и что делать при второй ветке исхода.