2015-10-09 2 views
4

Я могу использовать синтаксис обновления структуры с помощью одной структуры, но я не могу использовать его со структурным вариантом перечисления. Также я не могу обновить поле из структурного варианта перечисления с синтаксисом точки.Обновить поле в варианте struct-like enum

Например:

enum Enum { 
    Struct { 
     field1: i32, 
     field2: i32, 
    } 
} 

fn main() { 
    let mut my_enum = Enum::Struct { 
     field1: 1, 
     field2: 2, 
    }; 

    my_enum = Enum::Struct { 
     field1: 1, 
     .. my_enum 
    }; 

    my_enum = match my_enum { 
     [email protected]::Struct { field1, field2 } => Enum::Struct { 
      field1: 1, 
      .. strct 
     }, 
    }; 
} 

Оба способа дают мне ошибку:

functional record update syntax requires a struct 

Этот код:

my_enum.field1 = 3; 

дает мне следующую ошибку:

attempted access of field `field1` on type `Enum`, but no field with that name was found 

Как обновить поле из структурного варианта перечисления?

+0

Это на самом деле не «структура в перечисление». Такая вещь будет выглядеть как 'enum Foo {Variant (StructName)}'. Я забываю, что такое точное имя того, что у вас есть, но оно может быть «enum struct» или, возможно, «перечислимым вариантом структуры»? – Shepmaster

+0

Связанный, но не отвечает на ваш вопрос, это недавняя [серия блога] (http://smallcultfollowing.com/babysteps/blog/2015/08/20/virtual-structs-part-3-bringing-enums-and -структуры-вместе /), в котором говорится о совместном сближении двух концепций. – Shepmaster

+1

Это ссылка на "struct-like enum variant" [согласно] (http://doc.rust-lang.org/reference.html#enumerations) на ссылку, но я думаю, что ее обычно называют просто структурным вариантом. –

ответ

4

Вот один из способов сделать это:

match my_enum { 
    Enum::Struct { ref mut field1, .. } => { 
     *field1 = 3; 
    } 
} 
Смежные вопросы