darkmentat
хайте, а не подскажете, можно как-то сделать енум с методами?
darkmentat
ну, что бы кажый вариант энума реализовал метод
darkmentat
типа enum Action { DoSth, DoAnother }
Cuno
Никак. Тип то у енума один.
darkmentat
типа как-то трейт к нему прифигачеть мб
Cuno
Напиши конкретно что ты хочешь, пример "желаемого" кода.
darkmentat
сейча
darkmentat
enum Action { DoSth, DoAnother, } impl DoSth { fn perform(&self) {...} } impl DoAnother { fn perform(&self) {...} } //............... let action: Action = get_action(); action.perform();
Anton
Мб хэш таблицу?
darkmentat
эээ
darkmentat
при чем тут хэш таблицы?
Anton
Ну хеш таблицу с методами запилить
Anton
или match
Cuno
https://play.rust-lang.org/?gist=f5ce7712ab97a7fc798b08022327be5c&version=stable
Cuno
Вообще похоже что тебе нужен просто трейт обджект
Anton
ActionDoSth ActionDoAnother
darkmentat
Вообще похоже что тебе нужен просто трейт обджект
ну вроде нужен просто трейт, но фиксед сайз и чтоб компилятор меня не избивал х)
Маjко
Динамик диспатч — наше фсио
Cuno
https://play.rust-lang.org/?gist=829133b8cf87b60a0ebb160753af42d4&version=stable
darkmentat
Box<> - фиксед сайз
там когда я бокс с вектора достаю фигня
Cuno
вектор тоже фиксед сайз
Cuno
Тебе наверное нужен вектор боксов
Cuno
(если ты хочешь вектор из Action'ов)
darkmentat
его
darkmentat
https://play.rust-lang.org/?gist=f5ce7712ab97a7fc798b08022327be5c&version=stable
этот вариант вроде норм, если от того матча не избавиться, то все равно ок
darkmentat
сенкс
Cuno
https://play.rust-lang.org/?gist=8e11a8689d557af63a3a95b92460b7da&version=stable держи вектор
darkmentat
и я сейчас вернусь, когда я делаю с просто трейтами, там где-то плохо борроучекеру
Anonymous
еще вариант struct A { snip } struct B { snip } enum C { C1(A), C2(B) }
Anonymous
но обычно так и делают
Cuno
Зависит от задачи.
Anonymous
да
darkmentat
лады, другой вопрос
darkmentat
есть такая штука:
darkmentat
pub struct Character { pub name: String, pub strength: i32, pub dexterity: i32, pub stamina: i32, pub athletics: i32, pub melee: i32, pub health: i32, pub strategy: Vec<Box<Action>> } pub trait Action { fn perform_at(&self, actor: &mut Character, opt_target: Option<&mut Character>); } impl Character { pub fn act(&mut self, opponent: &mut Character, turn: usize) { let action: &Box<Action> = self.strategy.get(turn % self.strategy.len()).unwrap(); action.perform_at(self, Some(opponent)); } }
darkmentat
то она в методе act выдает: error[E0502]: cannot borrow `*self` as mutable because `self.strategy` is also borrowed as immutable --> src/character.rs:37:27 | 35 | let action = self.strategy.get(turn % self.strategy.len()).unwrap(); | ------------- immutable borrow occurs here 36 | 37 | action.perform_at(self, Some(opponent)); | ^^^^ mutable borrow occurs here 38 | } | - immutable borrow ends here
darkmentat
тоесть как я понимаю, оно почему-то не отпускает self.strategy
darkmentat
на этой строчке "let action: &Box<Action> = self.strategy.get(turn % self.strategy.len()).unwrap();"
Anonymous
логично
Anonymous
возьми во владение
darkmentat
э, а как?
Anonymous
clone
darkmentat
клонировать бокс?
Anonymous
ну
Anonymous
ты пытаешься передать владение когда у тебя занята часть массива
Alexey
вот! а в плюсах была бы уже ошибка 😊
darkmentat
чет ничего не понел(
darkmentat
Actionу заимплементить клон?
Anonymous
(*(self.strategy.get(turn % self.strategy.len()).unwrap())).clone()
Anonymous
наверняка много скобок можно убрать
darkmentat
но для Action чет не хочет имплементить Clone
Anonymous
потому что это трейт-объект
darkmentat
18 | pub strategy: Vec<Box<Action>> | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait 'action::Action' cannot be made into an object
darkmentat
ладно(
Cuno
clone() на workaround похож, тут бы как-нибудь код реорганизовать. Character точно должен хранить свои strategy?
darkmentat
pub trait Action: Clone { ..
darkmentat
тип так?
darkmentat
и потом каждому
darkmentat
#[derive(Clone)]
Cuno
воркараунд собственно чего?
Проблемы с бороучекером.
Anonymous
какой проблемы
darkmentat
думаю
Cuno
Да, если отделить strategy от остальных полей и передавать именно эти "остальные поля" в perform_at, то должно заработать.
Anonymous
кажется некоторые люди немного свехнулись на элиминации clone
Cuno
какой проблемы
cannot borrow `*self` as mutable because `self.strategy` is also borrowed as immutable Вот этой. Ты троллишь что ли?
Cuno
кажется некоторые люди немного свехнулись на элиминации clone
во первых с clone там все не так просто, во вторых это аллокация просто так.
Anonymous
фиксится ведь
Anonymous
нужно просто свой box создавать
Cuno
фиксится ведь
https://play.rust-lang.org/?gist=cdb76df1fb398e437b93bb65a28a5256&version=stable Хм?
darkmentat
странно, у меня почти тоже самое не работало
darkmentat
но я уже структуры поменял