У меня есть некоторая функция, которая должна принимать итератор, отдающий

ссылки на некоторый тип, но при этом вложенность ссылок может быть хоть какой, т.е. от &T до, скажем, &&&&&T. Какими трейтами воспользоваться, чтобы описать тип, возвращаемый итератором?

15 ответов

11 просмотров

enum? &T и &&T - это два разных типа, и объединить их в одном типе можно например через enum enum TRef<T> { R1(&T), R2(&&T), R3(&&&T), ... }

Iter: Iterator<Item = Item>, Item: std::ops::Deref<Target=T>,

megahomyak- Автор вопроса
Kirill Kuzminykh
enum? &T и &&T - это два разных типа, и объединить...

Мне не нужно объединять в один тип. Немного больше контекста: fn set_matches_from_actions<Callback, Actions, ActionRef>( matches: &mut Rc<slint::VecModel<ListItem>>, actions: Actions, ) where ActionRef: AsRef<Action<Callback>>, Actions: Iterator<Item = ActionRef>, { matches.set_vec( actions .map(|action| ListItem { text: action.as_ref().name.into(), }) .collect::<Vec<_>>(), ); } Итератор должен иметь возможность возвращать ссылку на Action любой глубины, т.к. поле name нужно лишь иммутабельное. При вызове функции выше как set_matches_from_actions(&mut matches, all_actions.iter());, где all_actions - Vec<Action>, получаю следующее: the trait bound `Action<[closure@src\main.rs:41:9: 43:10]>: std::convert::AsRef<Action<_>>` is not satisfied required because of the requirements on the impl of `std::convert::AsRef<Action<_>>` for `&Action<[closure@src\main.rs:41:9: 43:10]>

megahomyak- Автор вопроса
red75prime
Iter: Iterator<Item = Item>, Item: std::ops::Deref...

Попробовал это, на строчке set_matches_from_actions(&mut matches, matching_actions.iter());, где matching_actions - Vec<&mut Action>, получаю ```type mismatch resolving <&&mut Action<[closure@src\main.rs:41:9: 43:10]> as std::ops::Deref>::Target == Action<_> expected struct Action<_> found mutable reference `&mut Action<[closure@src\main.rs:41:9: 43:10]>````

megahomyak
Мне не нужно объединять в один тип. Немного больше...

Для ссылок разной глубины надо разный код для получения значения по этой ссылке. Просто так не получится сделать общий код, который будет работать с ссылками любой глубины вложенности. Только если в где-то в рантайме будет храниться информация о глубине ссылок и тогда можно будет замутить что-то для deref-а такой ссылки (например match по enum-у, или какую-ту рекурсивную функцию с unsafe-ами).

megahomyak- Автор вопроса
megahomyak
Мне не нужно объединять в один тип. Немного больше...

Ещё больше контекста: Код: https://www.toptal.com/developers/hastebin/isimecerer.rust (на плейграунде всё равно не запустится) Ошибка: https://www.toptal.com/developers/hastebin/oyiyobepid.rust

megahomyak- Автор вопроса
Kirill Kuzminykh
Для ссылок разной глубины надо разный код для полу...

В итераторе ссылки всегда будут одной и той же глубины, я просто не хочу писать несколько функций для обработки ссылок разной вложенности, т.е. тут нужно что-то сделать с дженериками

megahomyak
В итераторе ссылки всегда будут одной и той же глу...

Рекурсивные дженерики? Хм, интересная мысля. Это наверное что бы совсем было больно от работы с дженериками в расте 😊

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=8cfa24ad35ce68cea4c3992a91000ebb Должно работать

megahomyak- Автор вопроса
red75prime
https://play.rust-lang.org/?version=stable&mode=de...

Хм. Значит, у меня что-то не так. Судя по ошибке от самого rustc (была отправлена выше на hastebin, отправляю картинкой для удобства; до отправки ошибки я смотрел только на выдачу rust-analyzer'a на конкретной строке), происходит что-то не очень тривиальное. Пойду копать, т.к. если у вас работает, то у меня тоже должно заработать, если написать нормально

megahomyak- Автор вопроса
megahomyak
screenshot Хм. Значит, у меня что-то не так. Судя по ошибке о...

Если что, те же самые код и ошибка лежат здесь

red75prime
https://play.rust-lang.org/?version=stable&mode=de...

Может оно работает по той же причине по которой работает вот это? fn main() { let v = 1; println!("{:?}", &v); println!("{:?}", &&v); } Т.е. в твоём примере на самом деле у нас в результате дерефа не получается на выходе &T или T. Хотя видимо я не правильно понял что требуется.

Kirill Kuzminykh
Может оно работает по той же причине по которой ра...

Да, действительно. Там для T выводится не тот тип.

red75prime
Да, действительно. Там для T выводится не тот тип.

У тебя достаточно вот так сделать, и тоже будет работать fn foo<Iter, Item>(it: Iter) where Iter: Iterator<Item = Item>, Item: std::fmt::Debug, { for i in it { println!("{i:?}"); } }

megahomyak
screenshot Хм. Значит, у меня что-то не так. Судя по ошибке о...

Вот, погляди - может тебе так же сделать? https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b5a857c80518972122cdb37522512072

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

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

Ребята, я за проф советом😅 По микросервисам. В монолите есть общие файлы для сервисов: фетчи, конфиги, либы, утилсы.. как при распиле правильно их поддерживать? Пока вариант д...
Александр Тарасюк
1
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Подскажите где можно прочитать про реализацию возможности писать человеку при подписке на телеграм канал от имени бота? Было бы не плохо если для Telegraf@3.38.0
Pan Lipton
10
Мне вот что интересно, кто на рфе стартовал/играл, что вы фармили, в каком виде контента он прямо хорош? Экспедиция? Вроде прямо на замазанных мапах рф сдувается
Владислав
20
‌/r/pathofexile moderation changes top scoring links : pathofexile (RSS) Hi, everyone. On behalf of the subreddit mod team, I’m here to give you a few updates on the subreddi...
Esionru
3
Кто нибудь поясните это всё таки вброс или да? Про санктум слышал на поедб вбросили, а по дурке откуда инфа и на сколько это вообще правда? Пахнет шизофренией какой-то ✅Divi...
Dmitry Ritter
9
У вас бывает ощущение, что хочется потратить весь отпуск на то, чтоб только спать?
Николай
15
У меня вопрос к знающими, стоит ли вступать в гильдии в игре или лучше полная свобода?
Енот Полоскун
17
Как можно настроить фильтр в пое под себя?
Yarik yarik kyda ti lezesh
15
Ребят, есть какие нибудь мили билды, способные в шмотках с пола закрывать атлас?
Ninja Obormot
12
Карта сайта