Size: a a a

Rust — русскоговорящее сообществo

2020 August 20

В

Вафель in Rust — русскоговорящее сообществo
Не очень понимаю глобальной разницы между Iterator и Node в данном контексте
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Node в данном контексте лучше сравнивать с Entry в хэшмапе
источник

В

Вафель in Rust — русскоговорящее сообществo
Entry — тип, а не трейт, там не может быть ассоциированных типов
источник

V

Vladimir in Rust — русскоговорящее сообществo
Вафель
Для меня не очевидно(

Я бы так сделал:

trait Node {
   type Item;
}

struct Nil<T>(PhantomData<T>);

impl<T> Node for Nil<T> {
   type Item = T;
}

struct Cons<N: Node> {
   head: N::Item,
   tail: N,
}

impl<N: Node> Node for Cons<N> {
   type Item = N::Item;
}

(playground)
хз, почему не так
#[derive(Debug)]
struct LinkedList<T, U> {
   head: T,
   tail: U,
}

fn end<T>(head: T) -> LinkedList<T,()> {
   LinkedList {
       head: head,
       tail: (),
   }
}

fn cons<T,U>(head: T, tail: LinkedList<T, U>) -> LinkedList<T, LinkedList<T, U>> {
   LinkedList {
       head,
       tail
   }
}


fn main() {
   let list = cons(10, cons(20, end(1)));
   println!("{:?}", list);
}
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Вафель
Для меня не очевидно(

Я бы так сделал:

trait Node {
   type Item;
}

struct Nil<T>(PhantomData<T>);

impl<T> Node for Nil<T> {
   type Item = T;
}

struct Cons<N: Node> {
   head: N::Item,
   tail: N,
}

impl<N: Node> Node for Cons<N> {
   type Item = N::Item;
}

(playground)
ну в целом можно и так, да
источник

В

Вафель in Rust — русскоговорящее сообществo
Vladimir
хз, почему не так
#[derive(Debug)]
struct LinkedList<T, U> {
   head: T,
   tail: U,
}

fn end<T>(head: T) -> LinkedList<T,()> {
   LinkedList {
       head: head,
       tail: (),
   }
}

fn cons<T,U>(head: T, tail: LinkedList<T, U>) -> LinkedList<T, LinkedList<T, U>> {
   LinkedList {
       head,
       tail
   }
}


fn main() {
   let list = cons(10, cons(20, end(1)));
   println!("{:?}", list);
}
Чисто технически это позволяет делать LinkedList<i32, LinkedList<bool, ()>> (то что ты не можешь создать такое вне модуля — другой вопрос)
источник

V

Vladimir in Rust — русскоговорящее сообществo
Вафель
Чисто технически это позволяет делать LinkedList<i32, LinkedList<bool, ()>> (то что ты не можешь создать такое вне модуля — другой вопрос)
а с трейтом позволяет вообще реализовать Node для любого типа
источник

V

Vladimir in Rust — русскоговорящее сообществo
...
#[derive(Debug)]
struct X;

impl Node<i32> for X {}

fn main() {
   let list = cons(10, cons(20,  X));
   println!("{:?}", list);
}
источник

В

Вафель in Rust — русскоговорящее сообществo
Sealed в помощь
источник

V

Vladimir in Rust — русскоговорящее сообществo
Вафель
Sealed в помощь
это сейчас существует?)
источник

V

Vladimir in Rust — русскоговорящее сообществo
ну и тогда останется возможность реализовать это в модуле, как ты описал 😂
источник

KR

Kai Ren in Rust — русскоговорящее сообществo
Мб кто знаент как можно красиво сделать foo.as_mut().unwrap_or_default().push(bar)?

Хотелось бы чтобы Option<&mut T> автоматически сеттил T::default() если там None.
источник

KR

Kai Ren in Rust — русскоговорящее сообществo
Типа как entry API на HashMap, но на Option'е.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Kai Ren
Мб кто знаент как можно красиво сделать foo.as_mut().unwrap_or_default().push(bar)?

Хотелось бы чтобы Option<&mut T> автоматически сеттил T::default() если там None.
Так лайфтайм же не сойдется
источник

KR

Kai Ren in Rust — русскоговорящее сообществo
Mikail Bagishov
Так лайфтайм же не сойдется
Сойдётся. Мы ведь его положим по &mut туда, где его ожидали.
источник

KR

Kai Ren in Rust — русскоговорящее сообществo
источник

KR

Kai Ren in Rust — русскоговорящее сообществo
Туплю. Надо просто в доку глядеть больше.
источник

R

Roman in Rust — русскоговорящее сообществo
Если долго вглядываться в доку, то дога может начать вглядываться в тебя
источник

C

Constantine in Rust — русскоговорящее сообществo
Через несколько часов начнётся RustConf 🦀.
Прямая трансляция: https://youtu.be/ESXMg9OzWrQ
Расписание: https://rustconf.com/schedule
источник

NN

Nikita Nazarenko in Rust — русскоговорящее сообществo
чот в расписании полторы интересных темы
источник