рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓реЗрдЦ "рдж рд░рд╕реНрдЯ рд░рд┐рд▓реАрдЬрд╝ рдЯреАрдо" рдХреА рдШреЛрд╖рдгрд╛ 1.34.0 рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдБред
рд░рд╕реНрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреАрдо, рд░реВрд╕реНрдЯ рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг, 1.34.0 рдХреА рд░рд┐рд▓реАрдЬ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рд╕рдиреНрди рд╣реИред рд░рд╕реНрдЯ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рд╕рднреА рдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдХреБрд╢рд▓ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддреА рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдЬрдВрдЧ рдХрд╛ рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рддреЛ рдЬрдВрдЧ рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 1.34.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$ rustup update stable
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд░рд╕реНрдЯрдЕрдк рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╣рдорд╛рд░реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрда рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг 1.34.0 рдореЗрдВ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ
рдЗрд╕ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рд╕реБрдзрд╛рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдЧреЛ рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИред рдХреНрдпрд╛ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рд╕рдорд░реНрдерди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ ?
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, #[attribute(...)]
рдФрд░ TryFrom
рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рдХреБрдЫ рд╕реБрдзрд╛рд░ред рдкреНрд░рдореБрдЦ рдмрд╛рддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ рдпрд╛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рджреЗрдЦреЗрдВред
рд╡реИрдХрд▓реНрдкрд┐рдХ cargo
рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпрд╛рдВ
рд╕рдВрд╕реНрдХрд░рдг 1.0 рд╕реЗ рдкрд╣рд▓реЗ, рд░рд╕реНрдЯ рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдереА, crates.io ред рд▓реЛрдЧреЛрдВ рдиреЗ cargo publish
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдмрдХреНрд╕реЗ cargo publish
рдФрд░ cargo publish
Cargo.toml
рдХреЗ [dependencies]
рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЗрди рдмрдХреНрд╕реЗ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рдмрдХреНрд╕реЗ рдХреЛ crates.io рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ ред рдмрдВрдж рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ crates.io рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ git
рдпрд╛ path
рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЗ рд╕рдВрдЧрдарди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрдВрдж рд╕реНрд░реЛрдд рдмрдХреНрд╕реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд░реНрдерди рдХрд╛ рд▓рд╛рдн рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ crates.io рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдЗрд╕ рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде, рдХрд╛рд░реНрдЧреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпреЗ crates.io рдХреЗ рд╕рд╛рде рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ crates.io рдФрд░ рдЖрдкрдХреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, crates.io рд╕рдмрдХреНрд░реИрдХ рдмрд╛рд╣рд░реА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ .cargo/config
рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЖрдкрдХреЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА ( ~/.cargo/config
) рдпрд╛ рдкреИрдХреЗрдЬ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред
[registries] my-registry = { index = "https://my-intranet:8080/git/index" }
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЬрдм рдЖрдк Cargo.toml
рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ registry
рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдХрд╛рд░реНрдЧреЛ рдХреЛ рдкрддрд╛ Cargo.toml
рдХрд┐ рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗ рдЯреЛрдХрд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
[dependencies] other-crate = { version = "1.0", registry = "my-registry" }
рдЯреЛрдХрд░рд╛ рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдЕрдкрдирд╛ рдЯреЛрдХрд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ cargo login
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрди рдХреЛ ~/.cargo/credentials
рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛:
cargo login --registry=my-registry
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЙрд╕ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ --registry
рдлреНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд░реИрдХ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
cargo publish --registry=my-registry
рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреИрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
?
рдкреНрд░рд▓реЗрдЦрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ
рдХреНрдпрд╛ RFC 1937 рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛ ?
fn main()
, #[test]
рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ Option<T>
рдпрд╛ Result<T, E>
рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ Result<T, E>
рдЬрд╣рд╛рдВ fn main()
рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд┐рд░рд╛рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рд╕рдорд╛рдкреНрддрд┐ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИред ред
fn main()
рдФрд░ #[test]
рдореЗрдВ рд╕рдорд░реНрдерди рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓рд╛рдЧреВ #[test]
рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рдорд░реНрдерди рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рддрдХ рд╕реАрдорд┐рдд рдерд╛ рдЬрд┐рдирдореЗрдВ fn main()
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореМрдЬреВрдж fn main()
ред
?
рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ ?
рдкреНрд░рд▓реЗрдЦрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВред рдЕрдм рдЖрдк рдЕрдкрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдпрд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдкреНрд░рд▓реЗрдЦрди рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрднреА рднреА рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдХрд╕реНрдЯрдо рдЯреЛрдХрди рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди
рдЬрдВрдЧ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рддрдХ, рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреЗрдбрд╝реЛрдВ рдФрд░ рд╢рд╛рдмреНрджрд┐рдХ рдорд╛рд░реНрдЧреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рд╣реА рд╣реИрдВ:
#[foo(bar)] #[foo = "bar"] #[foo = 0] #[foo(bar = true)] #[foo(bar, baz(quux, foo = "bar"))]
рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпреЗ рд╕рд╣рд╛рдпрдХ рдЧреБрдг рдкрд░рд┐рд╕реАрдорди рдореЗрдВ рдЯреЛрдХрди рдХреА рдПрдХ рдордирдорд╛рдиреА рдзрд╛рд░рд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЖрдк #[range(0..10)]
рдпрд╛ #[bound(T: MyTrait)]
рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рдереЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЗ рд░реИрдХ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП #[range("0..10")]
ред
рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде, рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ #[attr($tokens)]
рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реБрдП, $tokens
рдореЗрдВ рдордирдорд╛рдиреА рдЯреЛрдХрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ ред рдпрджрд┐ рдЖрдк рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдЯреЛрдХрд░рд╛ рдХреЗ рд▓реЗрдЦрдХ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЯреЛрдХрди рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
TryFrom
рдФрд░ TryInto
TryFrom
рдФрд░ TryInto
рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ from_be_bytes
рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдХреЛ рдЕрдХреНрд╕рд░ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдореИрдиреБрдЕрд▓ рд░реВрдкрд╛рдВрддрд░рдг рдердХрд╛рдК рд╣реИред рдирдП рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдЗрд╕реЗ .try_into()
рдХреЗ рд╕рдорд╛рди рд▓рд╛рдЗрди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
let num = u32::from_be_bytes(slice.try_into()?);
рдРрд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛ рдЕрд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ, рдЬреИрд╕реЗ рдХрд┐ u8
рд╕реЗ u32
, u32
рдЯрд╛рдЗрдк рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, TryFrom
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрди рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ From
рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо !
рд▓рд┐рдП Infallible
рдЙрдкрдирд╛рдо рдмрдирд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ !
(рдХрднреА рдирд╣реАрдВ) ред
fn before_exec
unsafe fn pre_exec
рдкрдХреНрд╖ рдореЗрдВ рдкрджрд╛рд╡рдирдд рд╣реИ
рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░, CommandExt::before_exec
рдиреЗ CommandExt::before_exec
рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдХреНрд▓реЛрдЬрд░ рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА exec
ред
рдпрд╣ рдмрдВрдж рдХрд╛рдВрдЯрд╛ рдХреЗ рдмрд╛рдж рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдВрд╕рд╛рдзрди, рдЬреИрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░, рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЧреИрд░- Copy
рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреА рдПрдХ рдкреНрд░рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдореВрд▓ рдореВрд▓ рдореЗрдВ рд░рд╣реЗрдЧрд╛ред рдЗрд╕рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджреЛрд╣рд░рд╛рд╡ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ ред
рдЗрд╕рд▓рд┐рдП, before_exec
рдлрд╝рдВрдХреНрд╢рди рдХреЛ unsafe
рд░реВрдк рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ, рд╣рдордиреЗ fn before_exec
рдХреЛ unsafe fn pre_exec
рдкрдХреНрд╖ рдореЗрдВ unsafe fn pre_exec
ред рдЬрдм CommandExt::pre_exec
рдХреЙрд▓ рдХрд┐рдпрд╛ CommandExt::pre_exec
рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдХреНрд▓реЛрдЬрд░ рдЕрдорд╛рдиреНрдп рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдмрдирд╛рдХрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ CommandExt::pre_exec
рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рддреЛ before_exec
рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реИред рдЕрдкреНрд░рдЪрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдФрд░ unsafe
рд╕рд╛рде рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░реЗрдВред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд┐рд░реАрдХрд░рдг
1.34.0 рдореЗрдВ, рд╕реНрдерд┐рд░ рдкрд░рдорд╛рдгреБ рдкреВрд░реНрдгрд╛рдВрдХ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рдФрд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ 8 рдмрд┐рдЯ ( AtomicU8
8) рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ рдФрд░ 64 рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖред
NonZeroU8
рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдЬреИрд╕реЗ NonZeroU8
рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ рдереЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, Option<NonZeroU8>
u8
рдХреЗ рд╕рдорд╛рди рдЖрдХрд╛рд░ рд╣реИред рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ NonZeroI8
рдЬреИрд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд┐рд░ NonZeroI8
ред
рдХрд╛рд░реНрдп iter::from_fn
рдФрд░ iter::successors
рд╕реНрдерд┐рд░ рд╣реИрдВред рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ FnMut() -> Option<T>
рд╕реЗ FnMut() -> Option<T>
рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡реЗрдХреНрдЯрд░ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдм рдЖрдк from_fn(|| vec.pop())
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдмреАрдЪ, рджреВрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирдпрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреА рдЧрдгрдирд╛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИред
рд╕рд╛рде рд╣реА, рдирд┐рдореНрди API рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рджреЗрдЦреЗрдВред