Это вопрос, состоящий из двух частей: (1) Является ли хорошей практикой передавать статические ссылки на функции высшего порядка, чтобы они (параметры) жили достаточно долго? (2) Как лучше всего создать анонимную переменную со статическим временем жизни?
Вот контекст: у меня есть метафункция, которая возвращает закрытие на основе своих параметров. Чтобы параметры существовали достаточно долго, они должны быть статическими ссылками. Например.,
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));
}
который отлично работает, но я беспокоюсь, что могу изобретать велосипед здесь (или даже совершать антипаттерн).
get_getter(&Uncloneable::Variant)
как раз подходит для этого примера. - person mcarton   schedule 09.04.2020get_getter
будет простоgetter
. - person E_net4 the curator   schedule 09.04.2020