понедельник, 1 декабря 2014 г. в 16:59, Ryan Michael написал:
> I'm curious if the community has some design approaches to encapsulating
> interfaces to multiple generic implementations. For example, imagine I was
> writing an abstract database interface with multiple backing implementations
> for different stores (sqlite, pgsql, mysql, etc) and logging data to
> different types of loggers (stdout, file, network-attached, etc). The goal
> would be to implement some shared methods (insert, query, delete) to be
> delegated to different stores, with logging about the results.
>
> My first approach to this was to create traits, and use them in a struct
>
> trait Logger {
> fn log(&mut self, message: String),
> }
>
> trait Store {
> fn insert(&mut self, value: String),
> fn query(&mut self, conditions: String) -> Vec<String>,
> fn delete(&mut self, value: String),
> }
>
> struct Database {
> db: Store,
> logger: Logger,
> }
>
> AFAICT, this isn't possible - struct fields seem to require concrete types.
>
Hello Ryan,
I’ve had some luck by wrapping trait fields into boxes, with explicit lifetimes.
This should work:
struct Database<'a> {
db: Box<Store + 'a>,
logger: Box<Logger + 'a>,
}
Now, I’m not sure if that’s a community-accepted solution. Let’s see what the
others think. :)
Cheers,
Federico
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev