Size: a a a

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

2020 August 19

V

Vladimir in Rust — русскоговорящее сообществo
@mAX3773 нельзя сделать одну структуру опциональной, а не все поля?
источник

m

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

Э

Эрик in Rust — русскоговорящее сообществo
mAX
не, допустим приходят данные и мы их накапливаем, проверяем пока все не поступит, а потом отдаем пачкой
HashMap<String, String>, как JSON делает, не?
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
mAX
Товарищи, помогите пожалуйста найти красивое решение
Допустим есть структура
struct S1 {
   a: Option<u64>,
   b: Option<u64>,
   c: Option<u64>,
}
с несколькими Option<> элементами.. нужно их вытащить (take()) их все сразу если они все что-то содержат, иначе оставить как есть..
не хотелось бы копировать лишний  раз

пример моего текущего решения вот такой
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=aabb2e9a98ec16e147bace2f84789cc4

интересно есть ли возможность сделать это как-то короче без копирования элементов, лишних проверок и тд?
match *self {
   S1 { a: Some(a), b: Some(b), c: Some(c) } => {
       *self = S1 { a: None, b: None, c: None },
       Some(S2 { a, b, c })
   },
   _ => None
}
источник

В

Вафель in Rust — русскоговорящее сообществo
Andrey Vlasov
match *self {
   S1 { a: Some(a), b: Some(b), c: Some(c) } => {
       *self = S1 { a: None, b: None, c: None },
       Some(S2 { a, b, c })
   },
   _ => None
}
там &mut self
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Вафель
там &mut self
А сек
источник

V

Vladimir in Rust — русскоговорящее сообществo
Andrey Vlasov
match *self {
   S1 { a: Some(a), b: Some(b), c: Some(c) } => {
       *self = S1 { a: None, b: None, c: None },
       Some(S2 { a, b, c })
   },
   _ => None
}
мне кажется без разрушения стейта такое не будет работать (ну или копривания)
источник

Э

Эрик in Rust — русскоговорящее сообществo
Vladimir
мне кажется без разрушения стейта такое не будет работать (ну или копривания)
Будет.
источник

m

mAX in Rust — русскоговорящее сообществo
Andrey Vlasov
match *self {
   S1 { a: Some(a), b: Some(b), c: Some(c) } => {
       *self = S1 { a: None, b: None, c: None },
       Some(S2 { a, b, c })
   },
   _ => None
}
спасибо! интересное решение, не знал о таком!)
источник

Э

Эрик in Rust — русскоговорящее сообществo
Там же ему всё равно вытаскивать надо.
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
mAX
спасибо! интересное решение, не знал о таком!)
У меня копирование. Если у тебя мелкие вещи типа u64 в структуре, лучше забей и копируй
источник

m

mAX in Rust — русскоговорящее сообществo
да, нужно вытащить чтобы следующую пачку накапливать)
источник

В

Вафель in Rust — русскоговорящее сообществo
Andrey Vlasov
match *self {
   S1 { a: Some(a), b: Some(b), c: Some(c) } => {
       *self = S1 { a: None, b: None, c: None },
       Some(S2 { a, b, c })
   },
   _ => None
}
Работает только с копи типами
источник

m

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

В

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

Э

Эрик in Rust — русскоговорящее сообществo
Ну то есть, на самом деле он будет матчить по типу
let a = mem::take(&mut opstruct);
match a {
 S1 { a: Some(a), b: Some(b), c: Some(c) } => {
   /* do anything with a, b, c */
   return;
 },
 _ => (),
}
opstruct = a;
источник

В

Вафель in Rust — русскоговорящее сообществo
Вафель
Вообще, тут просто take_mut нужен
let mut ret = None;
take_mut::take(self, |this| match this {
   S1 { a: Some(a), b: Some(b), c: Some(c) } => {
       ret = S2 { a, b, c };
       S1::default()
   },
   etc => etc,
})
источник

В

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

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
О, можно же прочейниться по опшнам
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Будет без копирования
источник