Это вопрос, состоящий из двух частей: (1) Является ли хорошей практикой передача функций высшего порядка в состояние c, чтобы они (параметры) жили достаточно долго? (2) Каков наилучший способ создать анонимную переменную с stati c продолжительностью жизни?
Вот контекст: у меня есть мета-функция, которая возвращает замыкание на основе его параметров. Для того, чтобы параметры жили достаточно долго, они должны быть c ссылками. Например,
pub enum Uncloneable { Variant }
pub fn get_getter(param:&'static Uncloneable)
-> Box<dyn Fn() -> &'static Uncloneable> {
Box::new(move || { param })
}
Но я не хочу загромождать мой код множеством const
определений каждый раз, когда я вызываю get_getter
, например,
fn main() {
let _result = get_getter({
const VAR:Uncloneable = Uncloneable::Variant;
&VAR
});
}
Мое текущее решение - использовать макрос:
#[macro_export]
macro_rules! staticify {
($type:tt :: $variant:tt) => {{
const VAR:$type = $type::$variant;
&VAR
}};
}
fn main() {
let _result = get_getter(staticify!(Uncloneable::Variant));
}
, который прекрасно работает, но я боюсь, что я могу заново изобрести колесо (или даже применить какой-нибудь анти-шаблон).
Вот Полный код на Rust Playground.