Я использую ящик JSON Serde для десериализации файла JSON в структуру, и одно из свойств является необязательным. Если в свойстве отсутствует значение по умолчанию (из командной строки), оно подставляется. Это приводит меня к изменению моего кода, который вызывает следующую ошибку, и было трудно понять, как ее исправить.
Моя проблема в том, что я получаю type ascription is experimental error
, если я не назначаю значение временномупеременная, и я не понимаю, почему. Я покажу код и пропущу структуру для Config
, так как я не думаю, что эта часть имеет значение.
Вот код, который работает:
pub fn new(file_name: &str, param_urls: &[String]) -> Result<Config, io::Error> {
let mut config: Config = Config {
queue: None
};
if Path::new(file_name).exists() {
let json = read_to_string(file_name)?;
let c: Config = serde_json::from_str(&json)?;
config = c;
// ^^^^^^^ must use temporary c variable
}
if config.queue.is_none() {
config.queue = Some(param_urls.to_vec());
}
Ok(Config {
queue: None
})
}
Вышесказанное взяло меняНекоторое время нужно разобраться, и я не понимаю, почему это исправляет ошибку, но вот оригинальный исходный код, который вызывает ошибку.
pub fn new(file_name: &str, param_urls: &[String]) -> Result<Config, io::Error> {
let mut config: Config = Config {
queue: None
};
if Path::new(file_name).exists() {
let json = read_to_string(file_name)?;
config: Config = serde_json::from_str(&json)?;
// ^^^^^^^^^^^ ERROR! type ascription is experimental error
}
if config.queue.is_none() {
config.queue = Some(param_urls.to_vec());
}
Ok(Config {
queue: None
})
}
Как новый программист Rust, пришедший из других языков. Я просто не понимаю эту ошибку, и я погуглил ее без какого-либо четкого объяснения. С моей точки зрения, исходя из других языков, я не вижу здесь никакой разницы и не понимаю, в чем заключалась проблема, которая была исправлена или почему.