рд░рд╕реНрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреАрдо рд░рд╕реНрдЯ: 1.30.0 рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рд░рд┐рд▓реАрдЬ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рд╕рдиреНрди рд╣реИред рдЬрдВрдЧ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕реБрд░рдХреНрд╖рд╛, рдЧрддрд┐ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдЬрдВрдЧ рдХрд╛ рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рддреЛ рдЬрдВрдЧ рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 1.30.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$ rustup update stable
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ rustup
рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╣рдорд╛рд░реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрда рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Rust 1.30.0 рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреНрд╕ GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг 1.30.0 рдореЗрдВ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ
рд░рд╕реНрдЯ 1.30 рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд░рд┐рд▓реАрдЬ рд╣реИред рд▓реЗрдХрд┐рди рд╕реЛрдорд╡рд╛рд░ рдХреЛ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмреНрд▓реЙрдЧ рдХреЛ рд░рд╕реНрдЯ 1.31 рдХреЗ рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд┐ "рд░рд╕реНрдЯ 2018" рдХреА рдкрд╣рд▓реА рд░рд┐рд▓реАрдЬ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рди "рд╡реНрд╣рд╛рдЯ рд░рд╕реНрдЯ 2018" рдореЗрдВ рдорд┐рд▓реЗрдЧреАред
рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝
1.15 рд░рд╕реНрдЯ рдореЗрдВ рд╡рд╛рдкрд╕ , рд╣рдордиреЗ "рдХрд╕реНрдЯрдо рд╡реНрдпреБрддреНрдкрдиреНрди рдореИрдХреНрд░реЛрдЬрд╝" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, serde_derive
рдХрд╛ рдЙрдкрдпреЛрдЧ serde_derive
, рдЖрдк рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
#[derive(Serialize, Deserialize, Debug)] struct Pet { name: String, }
рдФрд░ Pet
рдХреЛ JSON рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ рдФрд░ serde_json
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд╛рдкрд╕ serde_json
ред рдпрд╣ serde_derive
рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Serialize
рдФрд░ serde_derive
Deserialize
рдХреЗ рд╕реНрд╡рдд: рдкреНрд░рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИред
рд░рд╕реНрдЯ 1.30 рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдлреИрд▓рддрд╛ рд╣реИ: "рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝" рдФрд░ "рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝"ред
рд╡рд┐рд╢реЗрд╖рддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ #[derive]
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрдиреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рддрд╛ рд╣реИ: рд╡реНрдпреБрддреНрдкрдиреНрди рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдЧрдгрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдиред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖рддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдЖрдкрдХреЛ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
#[route(GET, "/")] fn index() {
рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ #[route]
рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд╣реА рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдирдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЗрд╕ рддрд░рд╣ рд╣реЛрдВрдЧреЗ:
#[proc_macro_attribute] pub fn route(attr: TokenStream, item: TokenStream) -> TokenStream {
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ TokenStream
рджреЛ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: рдкрд╣рд▓рд╛ рд╣реИ рдЦреБрдж рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА, рдпрд╛рдиреА рдпреЗ GET, "/"
рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рджреВрд╕рд░рд╛ рдЙрд╕ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рдХрд╛рдп рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ fn index() {}
рдФрд░ рдмрд╛рдХреА рдХрд╛ рдлрдВрдХреНрд╢рди рд╣реИред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, sql!
:
let sql = sql!(SELECT * FROM posts WHERE id=1);
рдпрд╣ рдореИрдХреНрд░реЛ рдЕрдкрдиреЗ рдЕрдВрджрд░ SQL рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рдВрдЯреЗрдХреНрдЯрд┐рдХ рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ред рдПрдХ рд╕рдорд╛рди рдореИрдХреНрд░реЛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
#[proc_macro] pub fn sql(input: TokenStream) -> TokenStream {
рдпрд╣ рд╡реНрдпреБрддреНрдкрдиреНрди рдореИрдХреНрд░реЛ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ: рд╣рдо рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрд╖реНрдардХ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ use
рдЕрдм рдЖрдк рдЙрдкрдпреЛрдЧ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, serde-json
рдкреИрдХреЗрдЬ рд╕реЗ serde-json
рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
#[macro_use] extern crate serde_json; let john = json!({ "name": "John Doe", "age": 43, "phones": [ "+44 1234567", "+44 2345678" ] });
рдФрд░ рдЕрдм рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
extern crate serde_json; use serde_json::json; let john = json!({ "name": "John Doe", "age": 43, "phones": [ "+44 1234567", "+44 2345678" ] });
рдпрд╣рд╛рдВ, рдореИрдХреНрд░реЛ рдХреЛ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП macro_use
рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЕрдВрдд рдореЗрдВ, proc_macro рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ API рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдиреЗ рдПрдкреАрдЖрдИ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдореЗрдВ рднреА рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛, рдФрд░ syn
рдФрд░ quote
рдЬреИрд╕реЗ рдкреИрдХреЗрдЬ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ:
#[derive(Serialize)] struct Demo { ok: String, bad: std::thread::Thread, }
рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг:
error[E0277]: the trait bound `std::thread::Thread: _IMPL_SERIALIZE_FOR_Demo::_serde::Serialize` is not satisfied --> src/main.rs:3:10 | 3 | #[derive(Serialize)] | ^^^^^^^^^ the trait `_IMPL_SERIALIZE_FOR_Demo::_serde::Serialize` is not implemented for `std::thread::Thread`
рдЕрдм рдпрд╣ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
error[E0277]: the trait bound `std::thread::Thread: serde::Serialize` is not satisfied --> src/main.rs:7:5 | 7 | bad: std::thread::Thread, | ^^^ the trait `serde::Serialize` is not implemented for `std::thread::Thread`
рдореЙрдбреНрдпреВрд▓ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕реБрдзрд╛рд░
рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд░рд╕реНрдЯ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рджреБрдЦрдж рд╕реНрдерд╛рди рд░рд╣рд╛ рд╣реИ; рдЗрд╕рдХреЗ рдХреБрдЫ рдирд┐рдпрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдереЗред рдпреЗ рдмрджрд▓рд╛рд╡ рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИред
рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдирдП рд╕реБрдзрд╛рд░ use
ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬ рдЕрдм рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ , рдЕрд░реНрдерд╛рддреН :
рдкрдХрдбрд╝ рдпрд╣ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдореЙрдбреНрдпреВрд▓ рдкреНрд░рдгрд╛рд▓реА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдкреБрд░рд╛рдиреА рд╢реИрд▓реА рдХреА рд╣рдореЗрд╢рд╛ рдЬрд░реВрд░рдд рдирд╣реАрдВ рдереА:
extern crate serde_json; fn main() { // ; , `serde_json` // let json = serde_json::from_str("..."); } mod foo { fn bar() { // ; `foo`, `serde_json` // let json = serde_json::from_str("..."); } // - `use` use serde_json; fn baz() { // - `::serde_json`, // , let json = ::serde_json::from_str("..."); } }
рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдЯреВрдЯреЗ рд╣реБрдП рдХреЛрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рдерд╛ред рдЕрдм рдкрде рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рдпрджрд┐ рдпрд╣ рдХреБрдЫ extern crate
рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЙрдбреНрдпреВрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреЙрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдВрдд рдореЗрдВ, рдЯреЛрдХрд░реЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдпрд╛рдд рдХрд╛ рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░реЗ рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ :
mod foo { pub fn bar() {
рдкрде рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ crate
рдХреАрд╡рд░реНрдб рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрде рдкреИрдХреЗрдЯ рдХреЗ рдореВрд▓ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, use
рдЖрдпрд╛рдд рд▓рд╛рдЗрди рдореЗрдВ рдЗрдВрдЧрд┐рдд рдкрде рд╣рдореЗрд╢рд╛ рдкреИрдХреЗрдЬ рдХреА рдЬрдбрд╝ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рд╢реЗрд╖ рдХреЛрдб рдореЗрдВ рдкрде рдЬреЛ рд╕реАрдзреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рдереЗ, рдЬрд┐рд╕рд╕реЗ рдкрдереЛрдВ рдХрд╛ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рдЧрдпрд╛ рдерд╛ред
mod foo { pub fn bar() {
рдЬреИрд╕реЗ рд╣реА рдирдИ рд╢реИрд▓реА рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдмрджрд╕реВрд░рдд рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░реНрдг рдкрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ ::
ред
рдпреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рд╕рд╛рде рдЗрд╕ рдмрд╛рдд рдХреА рд╕рдордЭ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдХрд┐ рд░рд╛рд╕реНрддреЗ рдХреИрд╕реЗ рд╣рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЬрд╣рд╛рдБ рднреА рдЖрдкрдХреЛ рдкрде a::b::c
, use
рдХрдерди рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ:
- рдкреИрдХреЗрдЬ рдирд╛рдо рд╣реИ? рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЕрдВрджрд░
b::c
рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреАред - рдХреНрдпрд╛
a
рдЦреЛрдЬрд╢рдмреНрдж crate
? рдлрд┐рд░ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдкреИрдХреЗрдЬ рдХреА рдЬрдбрд╝ рд╕реЗ b::c
рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреАред - рдЕрдиреНрдпрдерд╛, рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ
a::b::c
рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреАред
рд╣рдореЗрд╢рд╛ рдкреИрдХреЗрдЬ рдХреЗ рдореВрд▓ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ use
рдореЗрдВ рдкрде рдХрд╛ рдкреБрд░рд╛рдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░, рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдирдИ рд╢реИрд▓реА рдореЗрдВ рдПрдХ рдмрд╛рд░ рдХреЗ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде, рдпреЗ рдирд┐рдпрдо рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╣рд░ рдЬрдЧрд╣ рд░рд╛рд╕реНрддреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ, рдФрд░ рдЖрдкрдХреЛ рдЪрд▓рддреЗ рд╕рдордп рдХреЛрдб рдХреЗ рдЖрдпрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рд╣реЛрдЧреАред
рдХрдЪреНрдЪреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
рдЕрдм рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреАрд╡рд░реНрдб рдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :
рдЕрдм рддрдХ, рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рдирд╣реАрдВ рд╣реИрдВ рдЬрдм рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛред рд▓реЗрдХрд┐рди рдПрдХ рджрд┐рди рдЖрдк Rust 2018 рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Rust 2015 рдХреЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рддрдм рдЙрдирдХреЗ рдХреАрд╡рд░реНрдб рдХрд╛ рд╕реЗрдЯ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рд╣рдо рд░реБрд╕реНрдд 2018 рдХреА рдЖрдЧрд╛рдореА рдШреЛрд╖рдгрд╛ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд┐рдирд╛ рдЖрд╡реЗрджрди
рд░рд╕реНрдЯ 1.6 рдореЗрдВ рд╡рд╛рдкрд╕, рд╣рдордиреЗ рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "no_std" рдФрд░ libcore рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреА рдШреЛрд╖рдгрд╛ рдХреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде: рдпрд╣ рдХреЗрд╡рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдерд╛, рд▓реЗрдХрд┐рди рдЖрд╡реЗрджрди рдирд╣реАрдВред
рдЬрдВрдЧ 1.30 рдореЗрдВ, рдЖрдк рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЖрддрдВрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #[panic_handler]
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рдХреЗрд╡рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдХреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдиреНрдп
рдПрдХ рдЖрдЦрд┐рд░реА рдЪреАрдЬ: рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ, рдЖрдк vis
рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬреИрд╕реЗ рдХрд┐ pub
рдЬреИрд╕реЗ рд╕реНрдХреЛрдк рдореЙрдбрд┐рдлрд╝рд╛рдпрд░ рдХреЛ рдореИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, "рдЯреВрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ", рдЬреИрд╕реЗ рдХрд┐ #[rustfmt::skip]
, рдЕрдм рд╕реНрдерд┐рд░ рд╣реЛ рдЧрдИ рд╣реИрдВ ред рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИ, рдЬреИрд╕реЗ #[allow(clippy::something)]
, рд╡реЗ рдЕрднреА рддрдХ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИрдВред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рджреЗрдЦреЗрдВред
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг
рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд API рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
Ipv4Addr::{BROADCAST, LOCALHOST, UNSPECIFIED}
Ipv6Addr::{BROADCAST, LOCALHOST, UNSPECIFIED}
Iterator::find_map
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреБрдЫ рдкрд╛рда рдХреЗ рдПрдХ рддрд░рдл рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ trim_left
ред рд╣рд╛рд▓рд╛рдБрдХрд┐, RTL рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ "рд╕рд╣реА" рдФрд░ "рдмрд╛рдПрдБ" рдХрд╛ рдЕрд░реНрде рднреНрд░рдо рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рдирд╛рдо рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ:
trim_left
-> trim_start
trim_right
-> trim_end
trim_left_matches
-> trim_start_matches
trim_right_matches
-> trim_end_matches
рд╣рдо рд░реВрд╕реНрдд 1.33 рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдирд╛рдореЛрдВ рдХреЛ рдЕрдкреНрд░рдЪрд▓рд┐рдд (рд▓реЗрдХрд┐рди рд╣рдЯрд╛рдирд╛ рдирд╣реАрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ) рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рджреЗрдЦреЗрдВред
рдХрд╛рд░реНрдЧреЛ рд╕рдВрд╡рд░реНрджреНрдзрди
рдЗрд╕ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХрд╛рд░реНрдЧреЛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреА рд╣реИ!

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