Реализовал первую поддержку и json, и flatbuffers параметров запроса. Теперь могу формализировать один из хаков для победы над лайфтаймами. Совсем простенький, но в начале не сразу было очевидно.
Кейс такой: нужно читать и json, и flatbuffers. Очевидно, для этого нужно создавать owned-структуры и хотелось бы создать третью, которая будет ссылаться на одну из структур (json/flatbuffers). Если просто втупую в разных ветках if'ов попарсить и сделать эту третью структуру — то борроу чекер обоснованно скажет, что структуры будут уничтожены в блоках if.
Но нет никаких проблем хранить эти структуры снаружи в Option. Сделал себе функцию даже:
pub fn store_in_option(opt: &mut Option, value: T) -> &T {
*opt = Some(value);
opt.as_ref().expect("just stored")
}
Тогда снаружи делаем let mut some_value = None на все значения которые нам нужно хранить во всех ветках, в ветках спокойно создаём их, пересохраняем let value = store_in_option(&mut some_value, value), свободно пользуемся полученной ссылкой, лайфтайм у неё будет как у some_value.
Раньше тоже так делал, но как-то не так сильно в глаза бросался приём.
#rust
Кейс такой: нужно читать и json, и flatbuffers. Очевидно, для этого нужно создавать owned-структуры и хотелось бы создать третью, которая будет ссылаться на одну из структур (json/flatbuffers). Если просто втупую в разных ветках if'ов попарсить и сделать эту третью структуру — то борроу чекер обоснованно скажет, что структуры будут уничтожены в блоках if.
Но нет никаких проблем хранить эти структуры снаружи в Option. Сделал себе функцию даже:
pub fn store_in_option(opt: &mut Option, value: T) -> &T {
*opt = Some(value);
opt.as_ref().expect("just stored")
}
Тогда снаружи делаем let mut some_value = None на все значения которые нам нужно хранить во всех ветках, в ветках спокойно создаём их, пересохраняем let value = store_in_option(&mut some_value, value), свободно пользуемся полученной ссылкой, лайфтайм у неё будет как у some_value.
Раньше тоже так делал, но как-то не так сильно в глаза бросался приём.
#rust