Loo
result.into_iter().map(|x| *x).collect() - спасибо
ну на всякий скажу, что если у тебя там будут в итераторе реально копи тайп и ссылка на него, вместо ручного разыменовывания ( .map(|x| *x)) можно делать .cloned() на итераторе, по сути будет эквивалентным
Berkus
Αλεχ
Αλεχ
очень воодушевляюще
Berkus
инжой!
Αλεχ
чет я не понял
Αλεχ
IntoIterator позволяет реализоват ьпоглощающий итератор
Αλεχ
а как просто походить не разрушая?
Αλεχ
IntoIterator для &T?
Cat
Просто Iterator?
Αλεχ
нет
Αλεχ
into_iter для референса
Αλεχ
impl<'a, T: Serialize> IntoIterator for &'a Array<T> {
type Item = T;
type IntoIter = ArrayIterator<'a, T>;
fn into_iter(self) -> <Self as IntoIterator>::IntoIter {
ArrayIterator {
array: self,
index: 0.into(),
}
}
}
pub struct ArrayIterator<'a, T: 'a + Serialize> {
array: &'a Array<T>,
index: U256,
}
impl<'a, T: Serialize> Iterator for ArrayIterator<'a, T> {
type Item = T;
fn next(&mut self) -> Option<<Self as Iterator>::Item> {
let result = self.array.get_item(self.index);
if result.is_some() {
self.index = self.index + 1.into();
}
result
}
}
Berkus
into_ вообще всегда поглощает оригинальный объект
Cat
или значения?
Αλεχ
я хочу, чтобы поглощался итератор, но не исходная коллекция
Berkus
iter()
Berkus
а потом поглощай его сколько угодно
Αλεχ
блин
Cuno
Αλεχ
у меня путаница из-за IEnumrable/IEnumerator
Αλεχ
там это раздельные вещи
Αλεχ
Αλεχ
он не идеоматичный?
Αλεχ
fn getNumbers(&mut self) -> Vec<U256> {
let array: Array<U256> = Array::new(DATA_KEY.clone());
array.into_iter().collect::<Vec<_>>();
array.into_iter().collect()
}
Cat
да, не идеоматичный
Αλεχ
стаковерфлоуплохомуначучил(
Cat
так а чем .iter() не нравится?
Αλεχ
так что по сути он T возвращает, да
Αλεχ
там итератор - совершенно бесполезный класс с кучей геморроя
Антон
Намеренно
Антон
Не нравится — инкапсулируй в свой тип
Антон
Кстати, зачем оно тебе понадобилось?
Berkus
наверное потому что он начинается на Unsafe?
Денис
чего это он неудобный? .get() и поехал, чё тебе ещё нужно от него?
Денис
ну уж нет
Денис
хотя в принципе можно навернуть trait-extension
Денис
но кагбе as_ref для него по сути-то ансейф
պլհկ
Это чувство когда хаскелист дорвался до сишки
Berkus
ты так говоришь будто это что-то хорошее
Vladimir
Vladimir
Нет, зачем туда смотреть?
Evgεny
госдолг видели?
vladislav
Вы шо программируете не понимая как работает процессор на физическом уровне
Evgεny
а ты не знаешь?
Αλεχ
че с стд не так?
Αλεχ
а зачем тебе это все?
Денис
блин, ну есть задачи, где это нужно)
Денис
те же самые ffi
Cat
например, актикс
Денис
под микроконтроллеры пишешь?
Денис
и причём тут аллокации и unsafe cell?
Денис
ну лан, не суть
Αλεχ
Αλεχ
у вектора например он просто достается от дерефа на слайс
Антон
Αλεχ
Его я реализовал
Αλεχ
Но мне сказали я не прав
Αλεχ
См выше
Alex
Сможешь баг найти?
Cat
Денис
хз, по-моему обычная практика
Денис
ну смотри, если у тебя есть тип T, и IntoIter заимплеменчен для &T, но не заимплеменчен для T, то при вызове на объекте t: T, он не будет поглощён, то вызовется метод для ссылки для него
Cat
okay
Денис
типа такого: https://play.rust-lang.org/?gist=f5306de24d6a70042c2d456ecd6e55a7&version=stable&mode=debug&edition=2015
Денис
ну т.е. как и сделано у @Psilon
Денис
Денис
я понимаю, что это нужно из-за U256, но всё равно выглядит сурово)
Αλεχ
Денис
на самом деле в том же векторе метод iter нужен только для того (как мне кажется), чтобы не писать (&v).into_iter()