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
Маjко
Cuno
https://play.rust-lang.org/?gist=f5ce7712ab97a7fc798b08022327be5c&version=stable
Cuno
Вообще похоже что тебе нужен просто трейт обджект
Anton
Anton
ActionDoSth
ActionDoAnother
Маjко
Маjко
Динамик диспатч — наше фсио
Cuno
Cuno
https://play.rust-lang.org/?gist=829133b8cf87b60a0ebb160753af42d4&version=stable
Cuno
вектор тоже фиксед сайз
Cuno
Тебе наверное нужен вектор боксов
Cuno
(если ты хочешь вектор из Action'ов)
darkmentat
его
darkmentat
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?
Cuno
darkmentat
pub trait Action: Clone { ..
darkmentat
тип так?
darkmentat
и потом каждому
darkmentat
#[derive(Clone)]
Anonymous
Cuno
Anonymous
какой проблемы
darkmentat
darkmentat
думаю
Cuno
Да, если отделить strategy от остальных полей и передавать именно эти "остальные поля" в perform_at, то должно заработать.
Anonymous
кажется некоторые люди немного свехнулись на элиминации clone
Cuno
какой проблемы
cannot borrow `*self` as mutable because `self.strategy` is also borrowed as immutable
Вот этой. Ты троллишь что ли?
Anonymous
Cuno
Anonymous
фиксится ведь
Anonymous
нужно просто свой box создавать
Cuno
фиксится ведь
https://play.rust-lang.org/?gist=cdb76df1fb398e437b93bb65a28a5256&version=stable
Хм?
darkmentat
странно, у меня почти тоже самое не работало
darkmentat
но я уже структуры поменял