рдЬрдВрдЧ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдмрдВрдж


рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд░рд╕реНрдЯ рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдмрд╛рдж рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдмрдЪрд╛рдиреЗ" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкреИрдЯрд░реНрди рд░рд╕реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рднреА рдХрднреА-рдХрднреА рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдирд╛ рдирд╛рдо рджрд┐рдпрд╛: "рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдмрдВрдж", рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдФрд░ рдХреИрд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕рдорд╕реНрдпрд╛


рдЬрдВрдЧ рдореЗрдВ, рдПрдХ рд╡рд┐рдХрд╕рд┐рдд рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рд░ рдХреНрд╖рдорддрд╛рдПрдВ рд╢рд╛рдпрдж 80% рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪрд░рд┐рддреНрд░ рдкреНрд░рдХрд╛рд░-рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╣рд╛рдВ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВ: рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдорд┐рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдк рдЗрди рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЙрд╕реА рдкреНрд░рдХрд╛рд░-рдкреНрд░рдХрд╛рд░-рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдЖрдзреЗ рдореЗрдВ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдорд┐рдЯрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЯрд╛рдЗрдк-рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?


рдирд┐рд░реНрдгрдп


рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ 'static рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП (рдЕрд░реНрдерд╛рдд, рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдЬрд┐рдирдореЗрдВ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ), рдЬрдВрдЧ Any рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП dyn Any рдкреНрд░рдХрд╛рд░-рд╡рд╕реНрддреБ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


 let value = "test".to_string(); let value_any = &value as &dyn Any; //       String.  //   -      . if let Some(as_string) = value_any.downcast_ref::<String>() { println!("String: {}", as_string); } else { println!("Unknown type"); } 

рдкреНрд░рд╛рд░рдВрдн


рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП Box downcast рд╡рд┐рдзрд┐ рднреА рд╣реИред


рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрдм рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрдЧрд╣ рдкрд░ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╡рд╕реНрддреБ рдХреЗ рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ? рдлрд┐рд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд▓реЗ рдЬрд╛рдПрдВ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ dyn Any рдХреЗ рд╕рд╛рде dyn Any рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЛ рдмрдЪрд╛рдПрдВ, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореВрд▓ рд╕реНрдерд╛рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПред


Rust рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдВрдЧ рдореЗрдВ рдЖрдЧреЗ рдХрд╣реАрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ "рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рдкрди" рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ: рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЖрдЗрдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡реГрдХреНрд╖ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЧреНрд░рд╛рдлрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдпрд╛ рддреЛ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдЖрджрд┐рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рдШрдЯрдХ - рдЧреНрд░рд╛рдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдкреЗрдбрд╝:


 enum Node { Prim(Primitive), Comp(Component), } struct Primitive { shape: Shape, children: Vec<Node>, } struct Component { node: Box<Node>, } enum Shape { Rectangle, Circle, } 

Component рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ Node рдкреИрдХреЗрдЬрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Component рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ Node рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ рдкреЗрдбрд╝ рдХреЗрд╡рд▓ рдХреБрдЫ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХрд╛ рдЕрдкрдирд╛ рдореЙрдбрд▓ рд╣реЛрдЧрд╛:


 struct Primitive<Model> { shape: Shape, children: Vec<Node<Model>>, } struct Component<Model> { node: Box<Node<Model>>, model: Model, //   Model } 

рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 enum Node<Model> { Prim(Primitive<Model>), Comp(Component<Model>), } 

рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рд╣рдорд╛рд░реА рдЬрд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдШрдЯрдХ рдХрд╛ рдЕрдкрдирд╛ рдореЙрдбрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдореВрд▓ рддрддреНрд╡ рдХрд╛ рдореЙрдбрд▓, рдЬрд┐рд╕рдореЗрдВ рдШрдЯрдХ рд╣реЛрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 enum Node<Model> { Prim(Primitive<Model>), Comp(Component), } struct Primitive<Model> { shape: Shape, children: Vec<Node<Model>>, _model: PhantomData<Model>, //   Model } struct Component { node: Box<dyn Any>, model: Box<dyn Any>, } impl Component { fn new<Model: 'static>(node: Node<Model>, model: Model) -> Self { Self { node: Box::new(node), model: Box::new(model), } } } 

рдкреНрд░рд╛рд░рдВрдн


рд╣рдордиреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбрд▓ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ new рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдШрдЯрдХ рдореЗрдВ рд╣реА рд╣рдо рдореЙрдбрд▓ рдФрд░ рд╕рдмрдЯреНрд░реА рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд┐рдЯрд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред


рдЕрдм use_model рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


 struct Component { node: Box<dyn Any>, model: Box<dyn Any>, use_model_closure: fn(&Component), } impl Component { fn new<Model: 'static>(node: Node<Model>, model: Model) -> Self { let use_model_closure = |comp: &Component| { comp.model.downcast_ref::<Model>().unwrap(); }; Self { node: Box::new(node), model: Box::new(model), use_model_closure, } } fn use_model(&self) { (self.use_model_closure)(self); } } 

рдкреНрд░рд╛рд░рдВрдн


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдШрдЯрдХ рдореЗрдВ рд╣рдо рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдмрдВрдж рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ new рд╡рд┐рдзрд┐ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдмрд╛рд╣рд░ рд╕реЗ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╣ Model рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреЛрдб рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЯреЙрдк-рд▓реЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХреЗрд╡рд▓ рджреГрд╢реНрдпрддрд╛ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред

use_model рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ use_model рдРрд╕реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ Model рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдореЙрдбрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдХреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдореЗрдВред


рд╡рд┐рдХрд▓реНрдк


рдпрджрд┐ рдШрдЯрдХ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░-рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдЯрд╛рдЗрдк-рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 enum Node<Model> { Prim(Primitive<Model>), Comp(Box<dyn ComponentApi>), } struct Component<Model> { node: Node<Model>, model: Model, } impl<Model> Component<Model> { fn new(node: Node<Model>, model: Model) -> Self { Self { node, model, } } } trait ComponentApi { fn use_model(&self); } impl<Model> ComponentApi for Component<Model> { fn use_model(&self) { &self.model; } } 

рдкреНрд░рд╛рд░рдВрдн


рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдореЗрдВ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рди рдХреЗрд╡рд▓ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдХрдмреНрдЬрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреНрд░рдХрд╛рд░ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЧреБрдг рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрджрд┐ рдЪрд░рд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХрдореЗрдВрдЯ рдореЗрдВ рд╢реЗрдпрд░ рдХрд░реЗрдВред

Source: https://habr.com/ru/post/hi454310/


All Articles