Я использую перечисление для выбора между различными сигнатурами функций. Пока функция имеет «нормальные» (размерные) параметры, такие как u8
, это отлично работает. Но как только я использую функцию с параметром slice в качестве параметра, я получаю ошибки компилятора. Я нашел обходное решение, но я не уверен, что это единственный способ решить эту проблему. И я не понимаю, почему. Предполагая, что функция хранится как указатель, как параметры изменяются, что возможно?Используйте перечисление с функцией, которая имеет параметр среза
#[derive(Copy, Clone/*, Debug, Eq, PartialEq*/)]
pub enum Function {
FunctionVal(fn(u8) -> String),
//FunctionSlice(fn(&[u8]) -> String), // E0277
FunctionSlice(&'static fn(&[u8]) -> String), // workaround
}
#[derive(Copy, Clone/*, Debug, Eq, PartialEq*/)]
pub struct FunctionStruct {
pub func: Function,
}
pub static FUNC1: FunctionStruct = FunctionStruct {
func: Function::FunctionVal(convert_u8_to_string),
};
static F2:fn(&[u8]) -> String = convert_u8slice_to_string;
pub static FUNC2: FunctionStruct = FunctionStruct {
func: Function::FunctionSlice(&F2), // to avoid E0308
};
fn convert_u8_to_string(_:u8) -> String { String::from("") }
fn convert_u8slice_to_string(_:&[u8]) -> String { String::from("") }
fn main() {
let f = FUNC1;
match f.func {
Function::FunctionVal(f) => { f(0); }
Function::FunctionSlice(f) => { f(&[0u8]); }
}
}
Как только есть срез в качестве параметра, #[derive(Debug, Eq, PartialEq)]
не возможно больше. Но это не проблема в моем случае.
Я не смог сделать FunctionSlice(fn(&[u8]) -> String),
работы. Мне пришлось использовать ссылочный тип со статическим временем жизни. В противном случае #[derive(Copy, Clone)]
потерпит неудачу. Чтобы инициализировать структуру, мне пришлось использовать дополнительный статический файл.
настоящее время я использую ржавчину 1.10
Я добавил реализаций 'PartialEq' и' Debug', потому что я нужен им сейчас. (Для моих собеседников). Ваш ответ также помог мне исправить это! – wimh