рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ 0xd34df00d рдиреЗ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ "рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рднрд╛рд╖рд╛ рд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИ; рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ, рдЪрд╛рд░ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
- рдЕрдЬрдЧрд░ - рдЧрддрд┐рд╢реАрд▓ рдЯрд╛рдЗрдкрд┐рдВрдЧ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рд▓рдЧрднрдЧ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ, рдХреБрдЫ рд╕рдВрдХреЗрдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ;
- рд╕реА - рдХрдордЬреЛрд░ рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ, рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА;
- рд╣рд╛рд╕реНрдХреЗрд▓ - рдордЬрдмреВрдд рд╕реНрдереИрддрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА;
- рдЗрджрд░реАрд╕ - рдЖрд╢реНрд░рд┐рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ, рдХрдВрдкрд╛рдЗрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╣реА рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
"рдпрд╣рд╛рдВ рд╕реА рд╣реИ рдФрд░ рд╣рд╕реНрдХреЗрд▓ рд╣реИ, рдФрд░ рдЬрдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?" - рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░реНрдЪрд╛ рдореЗрдВ рдпрд╣ рдкрд╣рд▓рд╛ рдкреНрд░рд╢реНрди рдерд╛ред рдЬрд╡рд╛рдм рдпрд╣рд╛рдБ рд╣реИред
рдЖрдЗрдП рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ:
рдореВрд▓реНрдпреЛрдВ рдФрд░ рдореВрд▓реНрдп рдХреА рд╕реВрдЪреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╕реВрдЪреА рдореЗрдВ рдореВрд▓реНрдп рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд▓реМрдЯрд╛рдПрдВ рдпрд╛ рд╕рдВрдХреЗрдд рджреЗрдВ рдХрд┐ рдпрд╣ рд╕реВрдЪреА рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд░ рдХреЛрдИ рдпрд╣ рд╕рдм рдирд╣реАрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд░рд╕реНрдЯ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдирд╣реАрдВ рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!
рд╕рд░рд▓ рдЦреЛрдЬ
рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рдЧрднрдЧ рднреЛрд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдХреБрдЫ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реА рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛:
fn foo(x: &[i32], y: i32) -> Option<usize> {
рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ? рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВред рдмреЗрд╢рдХ, Option<usize>
рдПрдХ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рд╕реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕ рдкрд░ рдПрдХ рдорд╣рд╛рди рд╕реБрдзрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рдЯреЗрд╕реНрдЯ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ:
#[test] fn test() { assert_eq!(foo(&[1, 2, 3], 2), Some(1)); assert_eq!(foo(&[1, 2, 3], 4), None); }
рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ - рдпреЗ рд╕рднреА рдЪреЗрдХ рдХреЗрд╡рд▓ рдкрд╛рдпрдерди рдореЗрдВ рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░, рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдкреВрд░реЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рдорджрдж рдХреЗ рд╣реЛрдВрдЧреЗ)ред
рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ, рд▓реНрдпреВрдХ!
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ? рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛:
fn foo<El>(x: &[El], y: El) -> Option<usize> where El: PartialEq, {
рдЦреИрд░, рдпрд╣ рдХреБрдЫ рд╣реИ! рдЕрдм рд╣рдо рдХрд┐рд╕реА рднреА рддреБрд▓рдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдХреЛрдИ рднреА рдЯреБрдХрдбрд╝рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкрд╖реНрдЯ рдмрд╣реБрд░реВрдкрддрд╛ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╣рд┐рдд (рд╣реИрд▓реЛ, рдкрд╛рдпрдерди) рдФрд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдлрд┐рд░ рдХреЛрдИ рдмрд╣реБрд░реВрдкрддрд╛ (рд╣реЗрд▓реЛ, рд╕реА), рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ?
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
fn refl<El: PartialEq + Copy>(el: El) -> Option<usize> { foo(&[el], el)
рдпрд╣ рдПрдХ рд▓рд╛рдкрддрд╛ рдмрд┐рдВрджреБ рдкрд░ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ refl
рдлрд╝рдВрдХреНрд╢рди рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрд╢рд╛ Some(0)
рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрдВрд╢рд┐рдХ-рд╕рдорддреБрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреИрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред
рд╢рд╛рдпрдж рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рддреЛ, рд╣рдо рдПрд▓ рдкреНрд░рдХрд╛рд░ рдкрд░ рдмрдВрдзреЗ рдХреЛ рдХрд╕ рджреЗрдВрдЧреЗ:
fn foo<El>(x: &[El], y: El) -> Option<usize> where El: Eq, {
рдЕрдм, рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, - рд╣рдореЗрдВ рдЗрд╕ рддреБрд▓рдирд╛ рдХреЗ рд╕рдордХрдХреНрд╖ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдкрд░реАрдХреНрд╖рдг рджреЛрдиреЛрдВ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд╛рдЗрдб рдиреЛрдЯ: рд╣рдо рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ!рдЗрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╕рд┐рджреНрдз рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: "рдЖрдк рдЬреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рдЙрджрд╛рд░ рд░рд╣реЗрдВ, рдЬреЛ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдмрдиреЗрдВ"ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ: рдпрджрд┐ рдЖрдк рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдП рдмрд┐рдирд╛ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм, рд╣рдо рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ:
fn foo<'a, El: 'a>(x: impl IntoIterator<Item = &'a El>, y: El) -> Option<usize> where El: Eq, {
рдЕрдм рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рди рдХреЗрд╡рд▓ рдЯреБрдХрдбрд╝рд╛ рдпрд╛ рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдордирдорд╛рдиреА рд╡рд╕реНрддреБ рд╣реИ, рдЬреЛ рдПрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдкреНрд░рд╢реНрди рдореЗрдВ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдБ, рддреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдпрд╣ рдкреНрд░рдХрд╛рд░ Iterable<Comparable>
ред
рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдЦреНрдд
рд▓реЗрдХрд┐рди рдЕрдм, рд╢рд╛рдпрдж рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдЧрд╛рд░рдВрдЯреА рдЪрд╛рд╣рд┐рдПред рдпрд╛ рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдФрд░ Vec
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рд╣рд░ рд╕рдВрднрд╡ рд╕рд░рдгреА рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдареЛрд╕ рд╕рд░рдгреА рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╡реИрд╕реЗ рднреА, рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгреА рдХреА рдЬрд░реВрд░рдд рд╣реИ - рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП, рдЬрдВрдЧ рдореЗрдВ рдПрдХ рдЯреЛрдХрд░рд╛ рд╣реИ ред
рдЕрдм, рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рдХреЛрдб рд╣реИ:
use generic_array::{GenericArray, ArrayLength}; fn foo<El, Size>(x: GenericArray<El, Size>, y: El) -> Option<usize> where El: Eq, Size: ArrayLength<El>, {
рд╣рдо рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ? рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдЖрдХрд╛рд░ рдХреА рд╕рд░рдгреА рд▓реЗрдЧрд╛, рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛ (рдФрд░ рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ - рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рди рдЧрд╛рд░рдВрдЯреА рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдереАред
рд▓реЗрдХрд┐рди рд╣рдо рдФрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЯрд╛рдЗрдк-рд╕реНрддрд░реАрдп рдЕрдВрдХрдЧрдгрд┐рдд
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЗрдЦ рдореЗрдВ рдЗрджрд░реАрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдХрдИ рдЧрд╛рд░рдВрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ - рдФрд░ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╕рд░рд▓, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдмреВрдд рдпрд╛ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрджрд▓рд╛рд╡, - рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп, рдпрджрд┐ рдпрд╣ Nothing
, рддреЛ рд╣рдореЗрд╢рд╛ рдХрдо рд╣реЛрдЧрд╛ рддреЛ рд╕реВрдЪреА рд▓рдВрдмрд╛рдИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ - рдпрд╛ рдЙрдирдХреЗ рдЬреИрд╕реЗ рдХреБрдЫ - рдРрд╕реА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдФрд░ рд╣рдо рд░рд╕реНрдЯ рд╕реЗ рд╕рдорд╛рди рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?
рдЯрд╛рдЗрдкрд┐рди рд╕реЗ рдорд┐рд▓реЗрдВ ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
use generic_array::{ArrayLength, GenericArray}; use typenum::{IsLess, Unsigned, B1}; trait UnsignedLessThan<T> { fn as_usize(&self) -> usize; } impl<Less, More> UnsignedLessThan<More> for Less where Less: IsLess<More, Output = B1>, Less: Unsigned, { fn as_usize(&self) -> usize { <Self as Unsigned>::USIZE } } fn foo<El, Size>(x: GenericArray<El, Size>, y: El) -> Option<Box<dyn UnsignedLessThan<Size>>> where El: Eq, Size: ArrayLength<El>, {
"рдпрд╣ рдХрд╛рд▓рд╛ рдЬрд╛рджреВ рдХреНрдпрд╛ рд╣реИ?" - рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЖрдк рд╕рд╣реА рд╣реИрдВ: рдЯрд╛рдЗрдкреЗрдирдо рдПрдХ рдХрд╛рд▓рд╛ рдЬрд╛рджреВ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЬрд╛рджреВ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛рдлреА рдареЛрд╕ рд╣реИред
- рдпрд╣ рд▓рдВрдмрд╛рдИ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдПрдХ рдФрд░ рдПрд▓ рдХреЗ рд╕рд╛рде рдПрд▓ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИред
- рдпрд╣ рдПрдХ рд╡рд┐рдХрд▓реНрдк рджреЗрддрд╛ рд╣реИ, рдЬреЛ, рдпрджрд┐ рдпрд╣ рдХреБрдЫ рд╣реИ,
- рдПрдХ рд▓рдХреНрд╖рдг рд╡рд╕реНрддреБ рд░рдЦрддрд╛ рд╣реИ, рдЬреЛ
UnsignedLessThan<Size>
рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ; - рдФрд░
UnsignedLessThan<T>
рдЬрд╣рд╛рдВ рднреА IsLess<T>
рдФрд░ IsLess<T>
рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ IsLess<T>
B1 рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рд╕рддреНрдпред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдХреЛ рд╕рд░рдгреА рдЖрдХрд╛рд░ рд╕реЗ рдХрдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ (рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо as_usize
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдореИрдВ рдЕрдм рджреЛ рдкреНрд░рдореБрдЦ рдХреИрд╡реЗрдЯ рдХреА рдмрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
- рд╣рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдиреБрдХрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ "рд╣реЙрдЯ" рдкрде рдкрд░ рд╣реЛрдЧрд╛, рддреЛ рдирд┐рд░рдВрддрд░ рдЧрддрд┐рд╢реАрд▓ рдбрд┐рд╕реНрдкреИрдЪ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдзреАрдорд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╣реИ:
- рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╛ рддреЛ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдЗрд╕рдХреА рд╢реБрджреНрдзрддрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдХреБрдЫ
unsafe
рд╕рд╛рде рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЯреНрд░рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреВрд░реНрд╡ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ, рдФрд░ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╕рд┐рд░реНрдл рдзреЛрдЦрд╛ рджреЗ рд░рд╣рд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдмреЗрд╢рдХ, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдпрд╛ рддреЛ рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг (рдЬреЗрдиреЗрд░рд┐рдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде) рдпрд╛ рд╕реНрдкреЙрдЗрд▓рд░ рдореЗрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде)ред рдмрд╛рдж рдХреА рд╕рднреА рдЪрд░реНрдЪрд╛ рд╢рд╛рдпрдж рдХрд┐рд╕реА рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣рд┐рдд рдХреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред
рд╡реИрд╕реЗ рднреА, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдордЬрдмреВрдд рдЗрджрд░реАрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреА рд╣реИ, рдореЗрд░реЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИред