рдЬрдВрдЧ 1.27 рд░рд┐рд▓реАрдЬ

рд░рд╕реНрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреАрдо, рд░реВрд╕реНрдЯ рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг: 1.27.0 рдХреА рд░рд┐рд▓реАрдЬ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рд╕рдиреНрди рд╣реИред рд░рд╕реНрдЯ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕реБрд░рдХреНрд╖рд╛, рдЧрддрд┐ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╣реИред


рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдЬрдВрдЧ рдХрд╛ рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рддреЛ рдЬрдВрдЧ рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 1.27.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


$ rustup update stable 

рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд░рд╕реНрдЯрдЕрдк рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╣рдорд╛рд░реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрда рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Rust 1.27.0 рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреНрд╕ GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред


рд╣рдо рдЗрд╕ рдкрд░ рднреА рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд╕рдВрд╕реНрдХрд░рдг 1.27.0 рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рд╕рдВрд╕реНрдХрд░рдг 1.26.0 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП match рдореИрдкрд┐рдВрдЧ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рдЦреЛрдЬ рдХреА, рдЬрд┐рд╕рд╕реЗ рдЧреИрд░-рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рджреЗрд░ рд╕реЗ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рдерд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг 1.26.0 рдХреЗ рдмрд╛рдж рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рд╣рдордиреЗ рд░реВрдЯреАрди рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рдиреЗ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг 1.27.1 рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рдВрд╕реНрдХрд░рдг 1.26.3ред рд╡рд┐рд╡рд░рдг рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рд▓реАрдЬ рдиреЛрдЯреНрд╕ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг 1.27.0 рдореЗрдВ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ


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


SIMD


рддреЛ, рдЕрдм рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдЕрдм рд╕реЗ, SIMD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬрдВрдЧ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ! SIMD рдХрд╛ рдЕрд░реНрде рд╣реИ "рдПрдХрд▓ рдирд┐рд░реНрджреЗрд╢, рдПрдХрд╛рдзрд┐рдХ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо" (рдПрдХрд▓ рдирд┐рд░реНрджреЗрд╢, рдПрдХрд╛рдзрд┐рдХ рдбреЗрдЯрд╛)ред рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 pub fn foo(a: &[u8], b: &[u8], c: &mut [u8]) { for ((a, b), c) in a.iter().zip(b).zip(c) { *c = *a + *b; } } 

рдпрд╣рд╛рдВ рд╣рдо рджреЛ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрд▓рд╛рдЗрд╕ рд▓реЗрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рддреАрд╕рд░реЗ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ: рдЖрдкрдХреЛ рддрддреНрд╡реЛрдВ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рдПрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдВрдХрд▓рдХ рдЕрдХреНрд╕рд░ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдкрд╛рддреЗ рд╣реИрдВред LLVM рдЕрдХреНрд╕рд░ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдХреЛрдб" рдХреЛ рд╕рджрд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬрдЯрд┐рд▓ рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рд╣реИ "SIMD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред" рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╕реНрд▓рд╛рдЗрд╕ a рдФрд░ b 16 рддрддреНрд╡ рд▓рдВрдмреЗ рд╣реИрдВ, рджреЛрдиреЛрдВред рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ u8 , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ 128 рдмрд┐рдЯ рдбреЗрдЯрд╛ рд╣реЛрдВрдЧреЗред SIMD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо 128-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рджреЛрдиреЛрдВ рд╕реНрд▓рд╛рдЗрд╕ a рдФрд░ b рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА 128 рдмрд┐рдЯреНрд╕ рдХреЛ c рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛!


рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд░рд╕реНрдЯ рдХрд╛ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рд╣рдореЗрд╢рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд░рд╣рд╛ рд╣реИ, рдХрднреА-рдХрднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╕ рдЗрддрдирд╛ рд╕рдордЭрджрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рд╕реАрдкреАрдпреВ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдПрд▓рдПрд▓рд╡реАрдПрдо рд╣рдореЗрд╢рд╛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рднрд┐рдиреНрди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд░реБрд╕реНрдд 1.27 рдореЗрдВ, std::arch рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛, рдЕрд░реНрдерд╛рдд рдЕрдм рд╣рдо рдХреЗрд╡рд▓ рдмреБрджреНрдзрд┐рдорд╛рди рд╕рдВрдХрд▓рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪреБрдирдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


 #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "avx2"))] fn foo() { #[cfg(target_arch = "x86")] use std::arch::x86::_mm256_add_epi64; #[cfg(target_arch = "x86_64")] use std::arch::x86_64::_mm256_add_epi64; unsafe { _mm256_add_epi64(...); } } 

рдпрд╣рд╛рдБ рд╣рдо cfg рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдХреЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ: x86 рдкрд░ рдЗрд╕рдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ x86_64 рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ред рд╣рдо рд░рдирдЯрд╛рдЗрдо рдкрд░ рднреА рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 fn foo() { #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { if is_x86_feature_detected!("avx2") { return unsafe { foo_avx2() }; } } foo_fallback(); } 

рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ: рдПрдХ AVX2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ SIMD рдЬреЛ рдЖрдкрдХреЛ 256-рдмрд┐рдЯ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдХреНрд░реЛ is_x86_feature_detected! рдПрдХ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдЬреЛ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ foo_avx2 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди foo_avx2 рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо AVX, foo_fallback рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╣рд╛рд░рд╛ foo_fallback ред рддреЛ рд╣рдорд╛рд░рд╛ рдХреЛрдб AVX2 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдпрджреНрдпрдкрд┐ рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИред


рдпрд╣ рд╕рдм рдереЛрдбрд╝рд╛ рдирд┐рдореНрди рд╕реНрддрд░ рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ - рд╣рд╛рдБ, рдпрд╣ рд╣реИ! std::arch рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджрд┐рдо рд╣реИрдВред рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдЕрднреА рднреА std::simd рдХреЛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдмреБрдирд┐рдпрд╛рджреА SIMD рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрджреНрднрд╡ рдЕрдм рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреЗрдЬ рдкреИрдХреЗрдЬ рджреЗрдЦреЗрдВред рдпрд╣рд╛рдБ SIMD рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:


 let lots_of_3s = (&[-123.456f32; 128][..]).iter() .map(|v| { 9.0 * v.abs().sqrt().sqrt().recip().ceil().sqrt() - 4.0 - 2.0 }) .collect::<Vec<f32>>(); 

рдЗрд╕ рдХреЛрдб рдореЗрдВ faster SIMD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:


 let lots_of_3s = (&[-123.456f32; 128][..]).simd_iter() .simd_map(f32s(0.0), |v| { f32s(9.0) * v.abs().sqrt().rsqrt().ceil().sqrt() - f32s(4.0) - f32s(2.0) }) .scalar_collect(); 

рдпрд╣ рд▓рдЧрднрдЧ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ: iter рдмрдЬрд╛рдп simd_map , simd_map рдмрдЬрд╛рдп f32s(2.0) , f32s(2.0) рдмрдЬрд╛рдп f32s(2.0) ред рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рдПрдХ рд╕рд┐рдордб-рдкреНрд░рдорд╛рдгрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХрднреА рднреА рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрднрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, regex рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ , рдФрд░ рдЗрд╕рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ SIMD рддреНрд╡рд░рдг рд╣реЛрдЧрд╛!


dyn Trait


рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ Rust рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдЦреЗрдж рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, Foo рд▓рд┐рдП, рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 Box<Foo> 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ Foo рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдереА, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЛ Box<T> рдЕрдВрджрд░ Box<T> ред рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдРрд╕реА рд╕рдорд╛рдирддрд╛рдПрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдиреБрднрд╡ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕рд┐рд░реНрдл Box<Trait> : impl SomeTrait for SomeOtherTrait рднреА рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ impl<T> SomeTrait for T where T: SomeOtherTrait рдЗрд╕рдХреЗ рдмрдЬрд╛рдпред рдпрд╣ impl SomeTrait рд╕рд╛рде рдРрд╕рд╛ рд╣реА рд╣реИ, рдЬреЛ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП impl Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, impl Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХрдо рдФрд░ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдЪ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рд░рд╕реНрдЯ 1.27 рдореЗрдВ, рд╣рдордиреЗ рдирдП dyn Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ред рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ рдСрдмреНрдЬреЗрдХреНрдЯ:


 //  =>  Box<Foo> => Box<dyn Foo> &Foo => &dyn Foo &mut Foo => &mut dyn Foo 

рдЗрд╕реА рддрд░рд╣ рдЕрдиреНрдп рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП: Arc<Foo> рдЕрдм Arc<dyn Foo> , рдЖрджрд┐ рд╣реИред рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдкреБрд░рд╛рдиреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдПрдХ bare-trait-object рд╕реНрдереИрддрд┐рдХ рдЪреЗрдХ рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдЪреЗрдХ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЪреЗрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреАред


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

#[must_use] рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП


рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛ #[must_use] рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ #[must_use] рдЧрдпрд╛ рд╣реИ: рдЕрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдкрд╣рд▓реЗ, рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рдерд╛, рдЬреИрд╕реЗ рдХрд┐ Result <T, E> ред рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 #[must_use] fn double(x: i32) -> i32 { 2 * x } fn main() { double(4); // warning: unused return value of `double` which must be used let _ = double(4); // (no warning) } 

рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рднреА рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ : Clone::clone , Iterator::collect рдФрд░ ToOwned::to_owned рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЙрдирдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдорд╣рдВрдЧреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдЬрд┐рдирдХреЗ рдкрд░рд┐рдгрд╛рдо рдЖрдк рдЧрд▓рддреА рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВред


рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рджреЗрдЦреЗрдВред


рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд┐рд░реАрдХрд░рдг


рдЗрд╕ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирдП рдПрдкреАрдЖрдИ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рджреЗрдЦреЗрдВред


рдХрд╛рд░реНрдЧреЛ рд╕рдВрд╡рд░реНрджреНрдзрди


рдЗрд╕ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХрд╛рд░реНрдЧреЛ рдХреЛ рджреЛ рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ рдорд┐рд▓реЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ --target-dir , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдХреНрд╖реНрдп рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдХрд╛рд░реНрдЧреЛ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд╛рд░реНрдЧреЛ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рднреАрддрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ, рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдпрддрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрднреА-рдХрднреА рд╕реНрдкрд╖реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдерд╛ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрдЧреЛ рджреЛрдиреЛрдВ рдЙрдирдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Cargo.toml [[example]] Cargo.toml рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХрд╛рд░реНрдЧреЛ рджреЗрдЦреЗрдЧрд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рджреВрд╕рд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ 'auto'- Cargo.toml ред рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЯреВрдЯрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬреЛ рдЗрд╕ рдкрд░ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХреБрдЫ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВ, рддреЛ рдЖрдк [package] рдЕрдиреБрднрд╛рдЧ рдореЗрдВ true рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП autoexamples рдХреБрдВрдЬреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рджреЗрдЦреЗрдВред


рдбреЗрд╡рд▓рдкрд░реНрд╕ 1.27.0


рд░реВрд╕реНрдд 1.27 рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рднрд╛рдЧ рд▓рд┐рдпрд╛ред рд╣рдо рдЖрдк рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред


рдзрдиреНрдпрд╡рд╛рдж!


рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдореИрдВ рдЦрдВрдбрд╣рд░ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдкреНрд░реВрдлрд░реАрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЙрдирдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЖрднрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реВрдВ

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


All Articles