Rust
PhantomData
Ricerca…
Utilizzo di PhantomData come marcatore di tipo
L'utilizzo del tipo PhantomData
come questo consente di utilizzare un tipo specifico senza che sia necessario far parte della Struct.
use std::marker::PhantomData;
struct Authenticator<T: GetInstance> {
_marker: PhantomData<*const T>, // Using `*const T` indicates that we do not own a T
}
impl<T: GetInstance> Authenticator<T> {
fn new() -> Authenticator<T> {
Authenticator {
_marker: PhantomData,
}
}
fn auth(&self, id: i64) -> bool {
T::get_instance(id).is_some()
}
}
trait GetInstance {
type Output; // Using nightly this could be defaulted to `Self`
fn get_instance(id: i64) -> Option<Self::Output>;
}
struct Foo;
impl GetInstance for Foo {
type Output = Self;
fn get_instance(id: i64) -> Option<Foo> {
// Here you could do something like a Database lookup or similarly
if id == 1 {
Some(Foo)
} else {
None
}
}
}
struct User;
impl GetInstance for User {
type Output = Self;
fn get_instance(id: i64) -> Option<User> {
// Here you could do something like a Database lookup or similarly
if id == 2 {
Some(User)
} else {
None
}
}
}
fn main() {
let user_auth = Authenticator::<User>::new();
let other_auth = Authenticator::<Foo>::new();
assert!(user_auth.auth(2));
assert!(!user_auth.auth(1));
assert!(other_auth.auth(1));
assert!(!other_auth.auth(2));
}
Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow