Size: a a a

AI Cups Official

2020 December 07

ST

Sergio Tulentsev in AI Cups Official
Товарищи-растоманы, подскажите по языку. Вот у нас в get_action передается Option<&mut DebugInterface>. Внутри непосредственно get_action я могу делать что-то вроде

 
if let Some(debug) = debug_interface {
 debug.send(...);
}

Но как мне передать это в другой вызов? Скажем, у меня есть функция build_houses и я из неё хочу тоже нарисовать что-нибудь.

Если передавать просто build_houses(debug_interface), то это будет move, что не подходит, конечно. А по другому пока не осилил.

Вот плейграунд для демонстрации: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f7a31a4f7eeeb9b346113ba1ebb0b311
источник

D

Dmitriy in AI Cups Official
Sergio Tulentsev
Товарищи-растоманы, подскажите по языку. Вот у нас в get_action передается Option<&mut DebugInterface>. Внутри непосредственно get_action я могу делать что-то вроде

 
if let Some(debug) = debug_interface {
 debug.send(...);
}

Но как мне передать это в другой вызов? Скажем, у меня есть функция build_houses и я из неё хочу тоже нарисовать что-нибудь.

Если передавать просто build_houses(debug_interface), то это будет move, что не подходит, конечно. А по другому пока не осилил.

Вот плейграунд для демонстрации: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f7a31a4f7eeeb9b346113ba1ebb0b311
присвой ссылку классу стратегии и вызывай из любого места
источник

D

Dmitriy in AI Cups Official
по крайней мере в С++ так можно
но... у меня своя отрисовка
источник

ST

Sergio Tulentsev in AI Cups Official
Dmitriy
присвой ссылку классу стратегии и вызывай из любого места
нет, не всё там так просто. Тот экземпляр что передается в get_action - он короткоживущий, создается специально под этот вызов. Вроде как нельзя его просто взять и сохранить на всё время жизни программы.
источник

D

Dmitriy in AI Cups Official
зачем на всё ?
переприсваивай каждый тик ивсё
источник

YK

Yevhen Kazmin in AI Cups Official
Sergio Tulentsev
Товарищи-растоманы, подскажите по языку. Вот у нас в get_action передается Option<&mut DebugInterface>. Внутри непосредственно get_action я могу делать что-то вроде

 
if let Some(debug) = debug_interface {
 debug.send(...);
}

Но как мне передать это в другой вызов? Скажем, у меня есть функция build_houses и я из неё хочу тоже нарисовать что-нибудь.

Если передавать просто build_houses(debug_interface), то это будет move, что не подходит, конечно. А по другому пока не осилил.

Вот плейграунд для демонстрации: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f7a31a4f7eeeb9b346113ba1ebb0b311
build_houses(&mut debug); внутри ифа
источник

ST

Sergio Tulentsev in AI Cups Official
Yevhen Kazmin
build_houses(&mut debug); внутри ифа
Сработает (вроде бы), но тоже так себе. Это мне каждый вызов так оборачивать?
источник

YK

Yevhen Kazmin in AI Cups Official
Можно передавать целый option, но нужно сделать так, чтоб мутабельная ссылка на DebugInterface была всегда одна. Можно заменить Option<&mut DebugInterface> на Option<Rc<DebugInterface>> и делать build_houses(debug_interface.clone()); вне ифа
источник

ST

Sergio Tulentsev in AI Cups Official
источник

YK

Yevhen Kazmin in AI Cups Official
Вместо 11 строки просто в объявлении функции mut напиши перед аргументом
источник

ST

Sergio Tulentsev in AI Cups Official
о, еще лучше
источник

ST

Sergio Tulentsev in AI Cups Official
не знал про это
источник

YK

Yevhen Kazmin in AI Cups Official
Yevhen Kazmin
Можно передавать целый option, но нужно сделать так, чтоб мутабельная ссылка на DebugInterface была всегда одна. Можно заменить Option<&mut DebugInterface> на Option<Rc<DebugInterface>> и делать build_houses(debug_interface.clone()); вне ифа
Rc - это плюсовый shared ptr, вдруг захочется сохранить debuginterface где-то
источник

YK

Yevhen Kazmin in AI Cups Official
Мне конечно не очень нравится
&mut Option<&mut DebugInterface>
источник

ST

Sergio Tulentsev in AI Cups Official
источник

YK

Yevhen Kazmin in AI Cups Official
Yevhen Kazmin
Мне конечно не очень нравится
&mut Option<&mut DebugInterface>
Хотя, видимо, по другому никак. Ведь вызов дебаг функции требует &mut self, значит Option тоже должен быть мутабельным
источник

ST

Sergio Tulentsev in AI Cups Official
something something interior mutability. Но про это я завтра перед работой почитаю :)
источник

ST

Sergio Tulentsev in AI Cups Official
В плюсах вот хорошо. Получил указатель и сохраняй его на здоровье куда хочешь. Хоть в файл :)
источник

YK

Yevhen Kazmin in AI Cups Official
Sergio Tulentsev
В плюсах вот хорошо. Получил указатель и сохраняй его на здоровье куда хочешь. Хоть в файл :)
В расте Rc<T> есть для такого
источник

YK

Yevhen Kazmin in AI Cups Official
Полная аналогия shared_ptr
источник