NLinker

Vector of polymorphic boxes with dyn trait

Apr 21st, 2020
904
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=7ccac7cdf77cbc63a7d6fabd75a8b86e
  2.  
  3. struct Message;
  4.  
  5. trait Filter {
  6.     type Checking;
  7.     fn check(&self, to_check: &Self::Checking) -> bool;
  8. }
  9.  
  10. struct SomeFilter<T> {
  11.     handler: fn(&T) -> bool,
  12. }
  13.  
  14. impl<T> Filter for SomeFilter<T> {
  15.     type Checking = T;
  16.     fn check(&self, to_check: &Self::Checking) -> bool {
  17.         (self.handler)(to_check)
  18.     }
  19. }
  20.  
  21. struct Handler<T> {
  22.     filters: Vec<Box<dyn Filter<Checking = T>>>,
  23.     handler: fn(&T) -> bool,
  24. }
  25.  
  26. impl<T> Handler<T> {
  27.     fn run(&self, message: &T) -> Option<bool> {
  28.         for filter in &self.filters {
  29.             let _result = filter.check(message);
  30.             if !_result {
  31.                 return None;
  32.             }
  33.         }
  34.  
  35.         Some((self.handler)(message))
  36.     }
  37. }
  38.  
  39. fn main() {
  40.     let filter_always_true = Box::new(SomeFilter {
  41.         handler: |_msg: &Message| true,
  42.     }) as Box<dyn Filter<Checking=Message>>;
  43.    
  44.     let filters = vec![filter_always_true];
  45.     let msg_handler = Handler::<Message> {
  46.         filters: filters,
  47.         handler: |_msg: &Message| true,
  48.     };
  49.  
  50.     println!("{}", msg_handler.run(&Message {}).unwrap());
  51. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×