Primeiro: sou um novato no Rust; aprendizado.
Esta questão surge provavelmente do pensamento em termos de outras línguas. Então, provavelmente, a melhor solução é fazer isso de uma maneira completamente diferente. As coisas ainda nem compilam, então peço desculpas se o código tiver problemas fundamentais.
Estou definindo minha primeira característica. A função trait leva 2 parâmetros, que definirão a saída.
trait SkFormatter {
fn to_sk(&self, key:Key, is_foreign: bool) -> String;
}
A ideia é que a implementação pegue uma variável de string, acrescente uma string dependendo da chave e acrescente uma string if is_foreign
(esta última parte não é relevante para a questão).
Por exemplo
MT-1c2af34
WD-54bdf36-FX
WD-ad3425b
Como essas strings são constantes, pensei que poderia fazer isso como um mapeamento global. Então eu criei primeiro
pub enum Key {
// there are 7 items, but keeping it short here
Metal,
Wood,
}
Aí quis criar o mapeamento e as coisas começaram a ficar complicadas. Tentei o HashMap primeiro:
use std::collections::HashMap;
static KEY_TO_PRE:HashMap<Key,&str> = HashMap::from([
(Key::Metal,"MT-"),
(Key::Wood, "WD-"),
]);
Mas isso estava reclamando com
o limite da característica
Key: std::hash::Hash
não está satisfeito
O que é surpreendente para mim, pois parece sugerir que a chave não é hashável, mas não estou definindo um tipo para ela, e assumiria que um tipo enum "semelhante a uma unidade", conforme documentado, é algum tipo de número inteiro ou alguma coisa?
Eu vi o match
idioma, talvez eu devesse tentar isso apenas dentro da implementação (coisas globais e estáticas são fedorentas para mim), mas não está claro para mim se a coisa da correspondência otimiza para reutilização, pois será chamada repetidamente.
Apenas aprendendo...
A resposta para isso é derivar as características necessárias do seu tipo de chave:
Não tenho certeza do que você quer dizer com "otimiza para reutilização". Mas geralmente usaríamos
match
se todas as strings fossem conhecidas em tempo de compilação:Então use isso em sua
to_sk
função.