172 похожих чатов

А есть какой-нибудь способ по тип-параметру узнать, скалярный он или

коллекция? Может трейт какой-то попросить?

pub fn next_opt<T: for<'de> Deserialize<'de>>(
arg: Option<serde_json::Value>,
) -> Result<Option<T>>


хочу десериализовывать из Value Option<T> по такому принципу:

`T` or `[T]` => Some(T)
`None` or `[]` => None
array of several elements => error

но есть проблемка:
- на next_opt<String>(Some(json!( ["a"] ))) мне нужно раскрывать массив прежде чем десериализовывать
- а на next_opt<Vec<String>>(Some(json!( ["a"] ))) раскрывать массив не нужно, нужно десериализовывать из массива тк T это массив

Как быть?

13 ответов

8 просмотров

Сделать свой трейт. Реализовать его для String и Vec<String>, требовать его в next_opt

Коллекции обычно итератор реализуют

folex- Автор вопроса
Пух
Коллекции обычно итератор реализуют

ну я же не могу это узнать в рантайме? Могу либо потребовать итератор, либо не требовать, т.е. это путь с next_opt_scalar и next_opt_collection

Вообще такое скорее всего через свой десериализатор пилить надо

red75prime
Сделать свой трейт. Реализовать его для String и V...

Реализовать разную обработку для T и Vec<T> пока не получится. Для этого нужна специализация. Поэтому String и Vec<String>

folex- Автор вопроса
Пух
Вообще такое скорее всего через свой десериализато...

подозреваю что там вылезет похожая проблема

folex- Автор вопроса
Пух
Untagged enum же как-то десериализуют

перебирает варианты просто

pl hk
перебирает варианты просто

Ну тут так же примерно можно

folex- Автор вопроса
pl hk
перебирает варианты просто

пробует, ловит ошибку, пробует следующий?

folex
пробует, ловит ошибку, пробует следующий?

Serde will try to match the data against each variant in order and the first one that deserializes successfully is the one returned. https://serde.rs/enum-representations.html#untagged

folex- Автор вопроса
pl hk
Serde will try to match the data against each vari...

Угу, это я знаю, просто думал вдруг вы знаете как оно реализовано :) Через перехват ошибки или как-то умнее спасибо!

Похожие вопросы

Обсуждают сегодня

Сообщение* в закодированном виде. То есть, просто сделать sendMessage?text=Привет бла-бла! не получится, надо в HEX переводить, и добавлять процент, типа такого: sendMessage?t...
КТ315
21
А случайно нет ли в паскале штатной возможности передать указатель и количество туда где array of в качестве аргумента?
zamtmn
25
Хм. А телеграм апи работают через HTTP?
The Bird of Hermes
14
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
58
Ну раз я пока тут, задам пару глупых вопросов. Зачем писать на ассемблере если компилятор довольно умный, а ассемблер много времени занимает? В каких прикладных задачах сейчас...
Максим Рябцев
20
Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
12
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
А какие чаты вообще в ходу? Auto aim? И что еше
do you think you're better off alone? А
13
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Карта сайта