{"id":375286,"date":"2024-05-21T06:20:52","date_gmt":"2024-05-21T06:20:52","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=375286"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=375286","title":{"rendered":"<span>\u041a\u043d\u0438\u0433\u0430 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 Rust. 1\/2<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/fj\/yi\/qn\/fjyiqnduv3l-rdgxnbu_t_qpgxk.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/fj\/yi\/qn\/fjyiqnduv3l-rdgxnbu_t_qpgxk.jpeg\" data-blurred=\"true\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>Hello world!<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/rust-lang-nursery.github.io\/rust-cookbook\/\">\u041a\u043d\u0438\u0433\u0430 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432<\/a> \u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u043e\u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b <code>Rust<\/code>.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/813791\/\">\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a><\/li>\n<li><a href=\"https:\/\/my-js.org\/docs\/guide\/rust-cookbook\">\u041a\u043d\u0438\u0433\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/a><\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"soderzhanie\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"#1-%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B\">1. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b<\/a><br \/> \n<ul>\n<li><a href=\"#11-%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9\">1.1. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/a><\/li>\n<li><a href=\"#12-%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2\">1.2. \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#2-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0\">2. \u041a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430<\/a><\/li>\n<li><a href=\"#3-%D1%81%D0%B6%D0%B0%D1%82%D0%B8%D0%B5\">3. \u0421\u0436\u0430\u0442\u0438\u0435<\/a><br \/> \n<ul>\n<li><a href=\"#32-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-tarball\">3.2. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 tarball<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#4-%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D0%B8%D0%B7%D0%BC\">4. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c<\/a><br \/> \n<ul>\n<li><a href=\"#41-%D1%8F%D0%B2%D0%BD%D1%8B%D0%B5-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8\">4.1. \u042f\u0432\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438<\/a><\/li>\n<li><a href=\"#42-%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85\">4.2. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#5-%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F\">5. \u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f<\/a><br \/> \n<ul>\n<li><a href=\"#51-%D1%85%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">5.1. \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"#52-%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">5.2. \u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#7-%D0%B1%D0%B0%D0%B7%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85\">7. \u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/a><br \/> \n<ul>\n<li><a href=\"#71-sqlite\">7.1. SQLite<\/a><\/li>\n<li><a href=\"#72-postgres\">7.2. Postgres<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#8-%D0%B4%D0%B0%D1%82%D0%B0-%D0%B8-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F\">8. \u0414\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f<\/a><br \/> \n<ul>\n<li><a href=\"#81-%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B8-%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D1%82%D1%8B-%D0%B8-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8\">8.1. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/a><\/li>\n<li><a href=\"#82-%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D0%B8-%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D1%82%D1%8B-%D0%B8-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8\">8.2. \u0420\u0430\u0437\u0431\u043e\u0440 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#9-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\">9. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#91-%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0\">9.1. \u041e\u0442\u043b\u0430\u0434\u043a\u0430<\/a><\/li>\n<li><a href=\"#92-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">9.2. \u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u041a\u043d\u0438\u0433\u0438 \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b <code>Cargo.toml<\/code> (\u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u0440\u0435\u0439\u0442\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[package] name = \"rust_cookbook\" version = \"0.1.0\" edition = \"2021\"  [dependencies] chrono = \"0.4.31\" crossbeam = \"0.8.3\" crossbeam-channel = \"0.5.10\" csv = \"1.3.0\" env_logger = \"0.11.3\" error-chain = \"0.12.4\" glob = \"0.3.1\" image = \"0.25.0\" lazy_static = \"1.4.0\" log = \"0.4.20\" mime = \"0.3.17\" num = \"0.4.1\" num_cpus = \"1.16.0\" postgres = \"0.19.7\" rand = \"0.8.5\" rayon = \"1.8.0\" regex = \"1.10.2\" reqwest = {version = \"0.11.23\", features = [\"blocking\", \"json\"]} same-file = \"1.0.6\" select = \"0.6.0\" serde = {version = \"1.0.193\", features = [\"derive\"]} serde_json = \"1.0.110\" threadpool = \"1.8.1\" tokio = { version = \"1.35.1\", features = [\"full\"] } unicode-segmentation = \"1.10.1\" url = \"2.5.0\" walkdir = \"2.4.0\" dotenv = \"0.15.0\" tempfile = \"3.9.0\" data-encoding = \"2.5.0\" ring = \"0.17.7\" clap = \"4.5.2\" ansi_term = \"0.12.1\" flate2 = \"1.0.28\" tar = \"0.4.40\" semver = \"1.0.22\" percent-encoding = \"2.3.1\" base64 = \"0.22.0\" toml = \"0.8.12\" memmap = \"0.7.0\"  [dependencies.rusqlite] version = \"0.31.0\" features = [\"bundled\"]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 <em>\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Linux.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/790556\/\">\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e Rust<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/785096\/\">\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e Rust<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h1 id=\"1-algoritmy\">1. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b<\/h1>\n<p>  <\/p>\n<h2 id=\"11-generaciya-proizvolnyh-znacheniy\">1.1. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/h2>\n<p>  <\/p>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b<\/strong><\/p>\n<p>  <\/p>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/fn.thread_rng.html\">rand::thread_rng<\/a> \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/trait.Rng.html\">rand::Rng<\/a>. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 (thread). \u0426\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f (uniform distribution) \u043f\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443 \u0442\u0438\u043f\u0430, \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439\/\u0442\u043e\u0447\u043a\u043e\u0439 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0442 0 \u0434\u043e, \u043d\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f 1.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rand::Rng;  fn main() {     let mut rng = rand::thread_rng();      let n1: u8 = rng.gen();     let n2: u16 = rng.gen();     println!(\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 u8: {}\", n1);     println!(\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 u16: {}\", n2);     println!(\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 u32: {}\", rng.gen::&lt;u32>());     println!(\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 i32: {}\", rng.gen::&lt;i32>());     println!(\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439: {}\", rng.gen::&lt;f64>()); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>[0, 10)<\/code> (\u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f <code>10<\/code>) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/doc.rust-lang.org\/rand\/*\/rand\/trait.Rng.html#method.gen_range\">Rng::gen_range<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rand::Rng;  fn main() {     let mut rng = rand::thread_rng();     println!(\"\u0426\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e: {}\", rng.gen_range(0..10));     println!(\"\u0427\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439: {}\", rng.gen_range(0.0..10.0)); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/distributions\/uniform\/struct.Uniform.html\">Uniform<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0438\u0441\u0435\u043b \u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rand::distributions::{Distribution, Uniform};  fn main() {     let mut rng = rand::thread_rng();     let die = Uniform::from(1..7);      loop {         let throw = die.sample(&amp;mut rng);         println!(\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0440\u043e\u0441\u043a\u0430 \u043a\u0443\u0431\u0438\u043a\u0430: {}\", throw);         if throw == 6 {             break;         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u043a\u0440\u0435\u0439\u0442\u0435 <code>rand<\/code> \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 (uniform distribution). \u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/rand_distr\/*\/rand_distr\/index.html\">rand_distr<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0438\u0434\u044b \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u2014 \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/distributions\/trait.Distribution.html#tymethod.sample\">Distribution::sample<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/trait.Rng.html\">rand::Rang<\/a>.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/docs.rs\/rand_distr\/*\/rand_distr\/index.html\">\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rand_distr::{Distribution, Normal, NormalError}; use rand::thread_rng;  fn main() -> Result&lt;(), NormalError> {     let mut rng = thread_rng();     let normal = Normal::new(2.0, 3.0)?;     let v = normal.sample(&amp;mut rng);     println!(\"{} \u0438\u0437 N(2, 9) \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\", v);     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0440\u0442\u0435\u0436\u0430 <code>(i32, bool, f64)<\/code> \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>Point<\/code>. \u0414\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0438\u043f\u0435 <code>Point<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/distributions\/trait.Distribution.html\">Distribution<\/a> \u0434\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/distributions\/struct.Standard.html\">Standard<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rand::Rng; use rand::distributions::{Distribution, Standard};  #[derive(Debug)] struct Point {     x: i32,     y: i32, }  impl Distribution&lt;Point> for Standard {     fn sample&lt;R: Rng + ?Sized>(&amp;self, rng: &amp;mut R) -> Point {         let (rand_x, rand_y) = rng.gen();          Point {             x: rand_x,             y: rand_y,         }     } }  fn main() {     let mut rng = rand::thread_rng();     let rand_tuple = rng.gen::&lt;(i32, bool, f64)>();     let rand_point: Point = rng.gen();     println!(\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0440\u0442\u0435\u0436: {:?}\", rand_tuple);     println!(\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Point: {:?}\", rand_point); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u0431\u0443\u043a\u0432 \u0438 \u0447\u0438\u0441\u0435\u043b<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 <code>ASCII<\/code> \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>A-Z, a-z, 0-9<\/code>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0440\u0430\u0437\u0446\u0430 <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/distributions\/struct.Alphanumeric.html\">Alphanumeric<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rand::{thread_rng, Rng}; use rand::distributions::Alphanumeric;  fn main() {     let rand_string: String = thread_rng()         .sample_iter(&amp;Alphanumeric)         .take(30)         .map(char::from)         .collect();      println!(\"{}\", rand_string); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 <code>ASCII<\/code> \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/rand\/*\/rand\/trait.Rng.html#method.gen_range\">Rng::gen_range<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     use rand::Rng;     \/\/ \u041d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432     const CHARSET: &amp;[u8] = b\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\                             abcdefghijklmnopqrstuvwxyz\\                             0123456789)(*&amp;^%$#@!~\";     const PASSWORD_LEN: usize = 30;     let mut rng = rand::thread_rng();      let password: String = (0..PASSWORD_LEN)         .map(|_| {             let idx = rng.gen_range(0..CHARSET.len());             CHARSET[idx] as char         })         .collect();      println!(\"{:?}\", password); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0442\u0438\u043b\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rand::distributions::{     uniform::{SampleRange, SampleUniform},     Distribution,     Standard, }; use rand::Rng;  \/\/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 pub fn generate_random_number&lt;T>() -> T where     Standard: Distribution&lt;T>, {     let mut rng = rand::thread_rng();     rng.gen::&lt;T>() }  \/\/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 pub fn generate_random_number_in_range&lt;T, R>(range: R) -> T where     T: SampleUniform,     R: SampleRange&lt;T>, {     let mut rng = rand::thread_rng();     rng.gen_range(range) }  #[derive(Debug)] pub struct Point {     pub x: i32,     pub y: i32, }  impl Distribution&lt;Point> for Standard {     fn sample&lt;R: Rng + ?Sized>(&amp;self, rng: &amp;mut R) -> Point {         let (rand_x, rand_y) = rng.gen();         Point {             x: rand_x,             y: rand_y,         }     } }  \/\/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 `Point` pub fn generate_random_point() -> Point {     let mut rng = rand::thread_rng();     rng.gen() }  const CHARSET: &amp;[u8] = b\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\                             abcdefghijklmnopqrstuvwxyz\\                             0123456789)(*&amp;^%$#@!~\";  \/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 pub fn generate_random_string(length: u8) -> String {     let mut rng = rand::thread_rng();     let len = CHARSET.len();      (0..length)         .map(|_| {             let i = rng.gen_range(0..len);             CHARSET[i] as char         })         .collect() }  \/\/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 pub fn generate_random_vector&lt;T>(n: usize) -> Vec&lt;T> where     Standard: Distribution&lt;T>, {     let mut numbers = Vec::new();     for _ in 0..n {         numbers.push(generate_random_number());     }     numbers }  #[cfg(test)] mod tests {     use super::*;      #[test]     fn test_generate_random_number() {         let n1 = generate_random_number::&lt;i8>();         assert!(n1 >= -128 &amp;&amp; n1 &lt; 127);         let n2 = generate_random_number::&lt;u16>();         assert!(n2 > 0);     }      #[test]     fn test_generate_random_number_range() {         let n1 = generate_random_number_range(0..10);         assert!(n1 >= 0 &amp;&amp; n1 &lt; 10);         let n2 = generate_random_number_range(10..=20);         assert!(n2 > 0 &amp;&amp; n2 &lt;= 20);     }      #[test]     fn test_generate_random_point() {         let rand_point: Point = generate_random_point();         assert!(             rand_point.x >= -2_147_483_648                 &amp;&amp; rand_point.x &lt; 2_147_483_647                 &amp;&amp; rand_point.y >= -2_147_483_648                 &amp;&amp; rand_point.y &lt; 2_147_483_647         );     }      #[test]     fn test_generate_random_string() {         let rand_string = generate_random_string(10);         assert!(rand_string.len() == 10 &amp;&amp; rand_string.is_ascii());     }      #[test]     fn test_generate_random_vec() {         let rand_vec = generate_random_vector::&lt;u16>(10);         assert!(rand_vec.len() == 10);     } }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"12-sortirovka-vektorov\">1.2. \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432<\/h2>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/vec\/struct.Vec.html#method.sort\">vec::sort<\/a>. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/doc.rust-lang.org\/std\/vec\/struct.Vec.html#method.sort_unstable\">vec::sort_unstable<\/a> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     let mut vec = vec![1, 5, 10, 2, 15];      vec.sort();      assert_eq!(vec, vec![1, 2, 5, 10, 15]); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u043a\u0442\u043e\u0440 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/primitive.slice.html#method.sort_by\">vec::sort_by<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.PartialOrd.html#tymethod.partial_cmp\">PartialOrd::partial_cmp<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     let mut vec = vec![1.1, 1.15, 5.5, 1.123, 2.0];      vec.sort_by(|a, b| a.partial_cmp(b).unwrap());      assert_eq!(vec, vec![1.1, 1.123, 1.15, 2.0, 5.5]); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 <code>Person<\/code> \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 <code>name<\/code> \u0438 <code>age<\/code> \u0432 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 (\u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443). \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>Person<\/code> \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0442\u0440\u0435\u0439\u0442\u043e\u0432: <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.Eq.html\">Eq<\/a>, <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.PartialEq.html\">PartialEq<\/a>, <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.Ord.html\">Ord<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/cmp\/trait.PartialOrd.html\">PartialOrd<\/a>. \u042d\u0442\u0438 \u0442\u0440\u0435\u0439\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 (derived). \u0414\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/vec\/struct.Vec.html#method.sort_by\">vec::sort_by<\/a> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)] struct Person {     name: String,     age: u32 }  impl Person {     pub fn new(name: String, age: u32) -> Self {         Person {             name,             age         }     } }  fn main() {     let mut people = vec![         Person::new(\"Zoe\".to_string(), 25),         Person::new(\"Al\".to_string(), 60),         Person::new(\"John\".to_string(), 1),     ];      \/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043b\u044e\u0434\u0435\u0439 \u0432 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 (\u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443)     people.sort();      assert_eq!(         people,         vec![             Person::new(\"Al\".to_string(), 60),             Person::new(\"John\".to_string(), 1),             Person::new(\"Zoe\".to_string(), 25),         ]);      \/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043b\u044e\u0434\u0435\u0439 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443     people.sort_by(|a, b| b.age.cmp(&amp;a.age));      assert_eq!(         people,         vec![             Person::new(\"Al\".to_string(), 60),             Person::new(\"Zoe\".to_string(), 25),             Person::new(\"John\".to_string(), 1),         ]);  }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0442\u0438\u043b\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">\/\/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 pub fn sort_integers&lt;T: std::cmp::Ord>(numbers: &amp;mut Vec&lt;T>) {     numbers.sort(); }  \/\/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 pub fn sort_floats&lt;T: std::cmp::PartialOrd>(numbers: &amp;mut Vec&lt;T>) {     numbers.sort_by(|a, b| a.partial_cmp(b).unwrap()); }  \/\/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u043f\u043e\u043b\u044e pub fn sort_by_field&lt;T, F>(vector: &amp;mut Vec&lt;T>, compare: F) where     F: FnMut(&amp;T, &amp;T) -> core::cmp::Ordering, {     vector.sort_by(compare) }  #[derive(Debug, Eq, Ord, PartialEq, PartialOrd)] pub struct Person {     pub name: String,     pub age: u32, }  impl Person {     pub fn new(name: String, age: u32) -> Self {         Person { name, age }     } }  #[cfg(test)] mod tests {     use super::*;      #[test]     fn test_sort_integers() {         let mut numbers = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];         sort_integers(&amp;mut numbers);         assert_eq!(numbers, vec![1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]);     }      #[test]     fn test_sort_floats() {         let mut numbers = vec![3.0, 1.0, 4.0, 1.0, 5.0, 9.0, 2.0, 6.0, 5.0, 3.0, 5.0];         sort_floats(&amp;mut numbers);         assert_eq!(             numbers,             vec![1.0, 1.0, 2.0, 3.0, 3.0, 4.0, 5.0, 5.0, 5.0, 6.0, 9.0]         );     }      #[test]     fn test_sort_persons() {         let mut people = vec![             Person::new(\"Zoe\".to_string(), 25),             Person::new(\"Al\".to_string(), 60),             Person::new(\"John\".to_string(), 1),         ];         sort_integers(&amp;mut people);         assert_eq!(             people,             vec![                 Person::new(\"Al\".to_string(), 60),                 Person::new(\"John\".to_string(), 1),                 Person::new(\"Zoe\".to_string(), 25),             ]         )     }      #[test]     fn test_sort_by_field() {         let mut people = vec![             Person::new(\"Zoe\".to_string(), 25),             Person::new(\"Al\".to_string(), 60),             Person::new(\"John\".to_string(), 1),         ];         sort_by_field(&amp;mut people, |a, b| b.age.cmp(&amp;a.age));         assert_eq!(             people,             vec![                 Person::new(\"Al\".to_string(), 60),                 Person::new(\"Zoe\".to_string(), 25),                 Person::new(\"John\".to_string(), 1),             ]         )     } }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"2-komandnaya-stroka\">2. \u041a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430<\/h1>\n<p>  <\/p>\n<p><strong>\u0420\u0430\u0437\u0431\u043e\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 (parsing) \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/clap\">clap<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use clap::{Arg, Command};  fn main() {     let matches = Command::new(\"My Test Program\")         .version(\"0.1.0\")         .author(\"Harry Heman\")         .about(\"Command line argument parsing\")         \/\/ \u0444\u0430\u0439\u043b         .arg(             Arg::new(\"file\")                 \/\/ \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0444\u043b\u0430\u0433 -f                 .short('f')                 \/\/ \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0444\u043b\u0430\u0433 --file                 .long(\"file\")                 .help(\"\u0424\u0430\u0439\u043b\"),         )         \/\/ \u0447\u0438\u0441\u043b\u043e         .arg(             Arg::new(\"num\")                 .short('n')                 .long(\"number\")                 .help(\"\u0412\u0430\u0448\u0435 \u043b\u044e\u0431\u0438\u043c\u043e\u0435 \u0447\u0438\u0441\u043b\u043e\"),         )         .get_matches();      let myfile = matches.get_one::&lt;String>(\"file\").unwrap();     println!(\"\u0424\u0430\u0439\u043b: {}\", myfile);      let num_str = matches.get_one::&lt;String>(\"num\");     match num_str {         None => println!(\"\u0412\u0430\u0448\u0435 \u043b\u044e\u0431\u0438\u043c\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\"),         Some(s) => match s.parse::&lt;i32>() {             Ok(n) => println!(\"\u0412\u0430\u0448\u0435 \u043b\u044e\u0431\u0438\u043c\u043e\u0435 \u0447\u0438\u0441\u043b\u043e: {}\", n),             Err(_) => println!(\"\u042d\u0442\u043e \u043d\u0435 \u0447\u0438\u0441\u043b\u043e: {}\", s),         },     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">cargo run -- -f myfile.txt -n 42<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">\u0424\u0430\u0439\u043b: myfile.txt \u0412\u0430\u0448\u0435 \u043b\u044e\u0431\u0438\u043c\u043e\u0435 \u0447\u0438\u0441\u043b\u043e: 42<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 <code>Rust CLI<\/code> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/kyclark\/command-line-rust\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p><strong>\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b ANSI<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/ansi_term\">ansi_term<\/a> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435.<\/p>\n<p>  <\/p>\n<p><code>ansi_term<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b: <a href=\"https:\/\/docs.rs\/ansi_term\/*\/ansi_term\/type.ANSIString.html\">ANSIString<\/a> \u0438 <a href=\"https:\/\/docs.rs\/ansi_term\/*\/ansi_term\/struct.Style.html\">Style<\/a>. <code>Style<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0442\u0438\u043b\u044f\u0445: \u0446\u0432\u0435\u0442, \u0432\u0435\u0441 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0434\u0440. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b <code>Colour<\/code> (\u0431\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>color<\/code>), \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0446\u0432\u0435\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u0430. <code>ANSIString<\/code> \u2014 \u044d\u0442\u043e \u043f\u0430\u0440\u0430 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 <code>Style<\/code>.<\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0447\u0430\u0442\u044c \u0446\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use ansi_term::Colour;  fn main() {     println!(\"This is {} in color, {} in color and {} in color\",         Colour::Red.paint(\"red\"),         Colour::Blue.paint(\"blue\"),         Colour::Green.paint(\"green\")); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0447\u0430\u0442\u044c \u0436\u0438\u0440\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0447\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>Style<\/code>. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/ansi_term\/0.11.0\/ansi_term\/struct.Style.html#method.new\">Style::new<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use ansi_term::Style;  fn main() {     println!(\"{} and this is not\",         Style::new().bold().paint(\"This is Bold\")); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0447\u0430\u0442\u044c \u0436\u0438\u0440\u043d\u043e\u0433\u043e \u0438 \u0446\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430<\/strong><\/p>\n<p>  <\/p>\n<p><code>Colour<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b <code>Style<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use ansi_term::Colour; use ansi_term::Style;  fn main(){     println!(\"{}, {} and {}\",         Colour::Yellow.paint(\"This is colored\"),         Style::new().bold().paint(\"this is bold\"),         Colour::Yellow.bold().paint(\"this is bold and colored\")); }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"3-szhatie\">3. \u0421\u0436\u0430\u0442\u0438\u0435<\/h1>\n<p>  <\/p>\n<h2 id=\"32-rabota-s-tarball\">3.2. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 tarball<\/h2>\n<p>  <\/p>\n<p><strong>\u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 tarball<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 (<a href=\"https:\/\/docs.rs\/flate2\/*\/flate2\/read\/struct.GzDecoder.html\">GzDecoder<\/a>) \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f (<a href=\"https:\/\/docs.rs\/tar\/*\/tar\/struct.Archive.html#method.unpack\">Archive::unpack<\/a>) \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u0441\u0436\u0430\u0442\u043e\u0433\u043e tarball <code>archive.tar.gz<\/code>, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use flate2::read::GzDecoder; use std::fs::File; use tar::Archive;  fn main() -> Result&lt;(), std::io::Error> {     \/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0432\u0430 (\u043f\u0443\u0442\u044c \u043a \u043d\u0435\u043c\u0443)     let path = \"archive.tar.gz\";     \/\/ \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b (\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430)     let tar_gz = File::open(path)?;     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \"\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430\" \u0430\u0440\u0445\u0438\u0432\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430     let tar = GzDecoder::new(tar_gz);     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0430\u0440\u0445\u0438\u0432\u0430     let mut archive = Archive::new(tar);     \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e     archive.unpack(\".\")?;      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0432 tarball<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0436\u0430\u0442\u0438\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>\/var\/log<\/code> \u0432 <code>archive.tar.gz<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.File.html\">File<\/a>, \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u0432 <a href=\"https:\/\/docs.rs\/flate2\/*\/flate2\/write\/struct.GzEncoder.html\">GzEncoder<\/a> \u0438 <a href=\"https:\/\/docs.rs\/tar\/*\/tar\/struct.Builder.html\">tar::Builder<\/a>. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>\/var\/log<\/code> \u0432 \u0430\u0440\u0445\u0438\u0432, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u0432 <code>backup\/logs<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/tar\/*\/tar\/struct.Builder.html#method.append_dir_all\">Builder::append_dir_all<\/a>. <code>GzEncoder<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434 \u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 <code>archive.tar.gz<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use flate2::write::GzEncoder; use flate2::Compression; use std::fs::File;  fn main() -> Result&lt;(), std::io::Error> {     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430     let tar_gz = File::create(\"archive.tar.gz\")?;     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \"\u0443\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430\" \u0430\u0440\u0445\u0438\u0432\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440     \/\/ \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430 \u0438 \u043c\u0435\u0442\u043e\u0434 \u0441\u0436\u0430\u0442\u0438\u044f     let enc = GzEncoder::new(tar_gz, Compression::default());     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0430\u0440\u0445\u0438\u0432\u0430     let mut tar = tar::Builder::new(enc);     \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 `backup\/logs` \u0432 \u0430\u0440\u0445\u0438\u0432 `archive.tar.gz` \u0438     \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e `\/var\/log`     tar.append_dir_all(\"backup\/logs\", \"\/var\/log\")?;     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 tarball \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u043f\u0443\u0442\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/tar\/*\/tar\/struct.Archive.html#method.entries\">Archive::entries<\/a>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/doc.rust-lang.org\/std\/path\/struct.Path.html#method.strip_prefix\">Path::strip_prefix<\/a> \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u043f\u0443\u0442\u0438 (<code>bundle\/logs<\/code>). \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c <a href=\"https:\/\/docs.rs\/tar\/*\/tar\/struct.Entry.html\">tar::Entry<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/tar\/*\/tar\/struct.Entry.html#method.unpack\">Entry::unpack<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use std::fs::File; use std::path::PathBuf; use flate2::read::GzDecoder; use tar::Archive;  error_chain! {   foreign_links {     Io(std::io::Error);     StripPrefixError(std::path::StripPrefixError);   } }  fn main() -> Result&lt;()> {     let file = File::open(\"archive.tar.gz\")?;     let mut archive = Archive::new(GzDecoder::new(file));     let prefix = \"bundle\/logs\";      println!(\"Extracted the following files:\");     archive         \/\/ \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b         .entries()?         .filter_map(|e| e.ok())         \/\/ \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430         .map(|mut entry| -> Result&lt;PathBuf> {             \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u043f\u0443\u0442\u0438             let path = entry.path()?.strip_prefix(prefix)?.to_owned();             \/\/ \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c             entry.unpack(&amp;path)?;             \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0443\u0442\u044c             Ok(path)         })         .filter_map(|e| e.ok())         .for_each(|x| println!(\"> {}\", x.display()));      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"4-parallelizm\">4. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c<\/h1>\n<p>  <\/p>\n<h2 id=\"41-yavnye-potoki\">4.1. \u042f\u0432\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/crossbeam\/\">crossbeam<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e (concurrent) \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e (parallel) \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/crossbeam\/*\/crossbeam\/thread\/struct.Scope.html#method.spawn\">Scope::spawn<\/a> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 (\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442) \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (scoped thread), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"https:\/\/docs.rs\/crossbeam\/*\/crossbeam\/fn.scope.html\">crossbeam::scope<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u0435\u043b\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043f\u043e\u043b\u0430\u043c \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     let arr = &amp;[1, 25, -4, 10];     let max = find_max(arr);     assert_eq!(max, Some(25)); }  fn find_max(arr: &amp;[i32]) -> Option&lt;i32> {     const THRESHOLD: usize = 2;      if arr.len() &lt;= THRESHOLD {         \/\/ `iter()` \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 (\u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f - `Some(&amp;i32)`)         \/\/ `cloned()` - \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430         \/\/  (`&amp;T` \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 `T`, \u0442\u0438\u043f\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f - `Some(i32)`)         \/\/ `max()` - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430         return arr.iter().cloned().max();     }      \/\/ \u0414\u0435\u043b\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043f\u043e\u043b\u0430\u043c     let mid = arr.len() \/ 2;     let (left, right) = arr.split_at(mid);      crossbeam::scope(|s| {         \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043b\u0435\u0432\u043e\u0439 \u0438 \u043f\u0440\u0430\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0435\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u0430         let thread_l = s.spawn(|_| find_max(left));         let thread_r = s.spawn(|_| find_max(right));          \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u043e\u0432         \/\/ `join()` - \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430         \/\/ (\u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0436\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430)         \/\/ \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442         let max_l = thread_l.join().unwrap()?;         let max_r = thread_r.join().unwrap()?;          \/\/ `max()` \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439         Some(max_l.max(max_r))     })     .unwrap() }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u0440\u0435\u0439\u0442\u044b <a href=\"https:\/\/docs.rs\/crossbeam\/\">crossbeam<\/a> \u0438 <a href=\"https:\/\/docs.rs\/crossbeam-channel\/*\/crossbeam_channel\/index.html\">crossbeam_channel<\/a> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 (pipeline). \u0415\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 (<code>sender<\/code>), \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 (<code>receiver<\/code>) \u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 (worker threads, workers) \u043d\u0430 \u043f\u0443\u0442\u0438 \u043e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043a \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 (bounded) \u043a\u0430\u043d\u0430\u043b\u044b \u0441 \u0435\u043c\u043a\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0432\u043d\u043e\u0439 <code>1<\/code>, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/crossbeam-channel\/*\/crossbeam_channel\/fn.bounded.html\">crossbeam_channel::bounded<\/a>. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0447\u0430\u0449\u0435, \u0447\u0435\u043c &#171;\u0432\u043e\u0440\u043a\u0435\u0440\u044b&#187; \u043c\u043e\u0433\u0443\u0442 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c (\u043e\u043d\u0438 \u0441\u043f\u044f\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 500 \u043c\u0441). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 500 \u043c\u0441 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <a href=\"https:\/\/docs.rs\/crossbeam\/latest\/crossbeam\/channel\/struct.Sender.html#method.send\">crossbeam_channel::Sender::send<\/a>, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b\u0435. \u0422\u0430\u043a\u0436\u0435 <em>\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u044e\u0431\u044b\u043c \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u0445 \u043f\u0435\u0440\u0432\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u043e\u0440\u043a\u0435\u0440\u0443, \u0430 \u043d\u0435 \u043e\u0431\u043e\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 <a href=\"https:\/\/docs.rs\/crossbeam-channel\/*\/crossbeam_channel\/struct.Receiver.html#method.iter\">crossbeam_channel::Receiver::iter<\/a> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u043d\u0430\u043b\u044b \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/crossbeam\/*\/crossbeam\/fn.scope.html\">crossbeam::scope<\/a>, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>drop<\/code> \u0432\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0446\u0438\u043a\u043b\u0430\u043c\u0438 <code>for<\/code> \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432. \u041e \u0432\u044b\u0437\u043e\u0432\u0430\u0445 <code>drop<\/code> \u043c\u043e\u0436\u043d\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u0445 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043a\u0430\u043d\u0430\u043b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::thread; use std::time::Duration; use crossbeam_channel::bounded;  fn main() {     let (snd1, rcv1) = bounded(1);     let (snd2, rcv2) = bounded(1);     let n_msgs = 4;     let n_workers = 2;      crossbeam::scope(|s| {         \/\/ \u041f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f         s.spawn(|_| {             for i in 0..n_msgs {                 snd1.send(i).unwrap();                 println!(\"Source sent {}\", i);             }             \/\/ \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b - \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430             \/\/ \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 `for` \u0432 \u0432\u043e\u0440\u043a\u0435\u0440\u0435             drop(snd1);         });          \/\/ \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438\/\u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438         for _ in 0..n_workers {             \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430             let (sendr, recvr) = (snd2.clone(), rcv1.clone());             \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445             s.spawn(move |_| {                 thread::sleep(Duration::from_millis(500));                 \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430                 for msg in recvr.iter() {                     println!(\"Worker {:?} received {}\", thread::current().id(), msg);                     sendr.send(msg * 2).unwrap();                 }             });         }         \/\/ \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b, \u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 `for`         drop(snd2);          \/\/ \u041f\u0440\u0438\u0435\u043c\u043d\u0438\u043a         for msg in rcv2.iter() {             println!(\"Sink received {}\", msg);         }     }).unwrap(); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/crossbeam-channel\/*\/crossbeam_channel\/index.html\">crossbeam_channel<\/a> \u0432 \u0441\u0445\u0435\u043c\u0435 &#171;\u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u2014 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c&#187; (single producer \u2014 single consumer, SPSC). \u041c\u0435\u0442\u043e\u0434\u044b <a href=\"https:\/\/docs.rs\/crossbeam\/*\/crossbeam\/fn.scope.html\">crossbeam::scope<\/a> \u0438 <a href=\"https:\/\/docs.rs\/crossbeam\/*\/crossbeam\/fn.scope.html\">Scope::spawn<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f. \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043d\u0430\u043b <a href=\"https:\/\/docs.rs\/crossbeam-channel\/*\/crossbeam_channel\/fn.unbounded.html\">crossbeam_channel::unbounded<\/a>. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 (\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u0445 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f) \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e. \u041f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0441\u043f\u0438\u0442 100 \u043c\u0441 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::{thread, time}; use crossbeam_channel::unbounded;  fn main() {     let (snd, rcv) = unbounded();     let n_msgs = 5;      crossbeam::scope(|s| {         s.spawn(|_| {             for i in 0..n_msgs {                 snd.send(i).unwrap();                 thread::sleep(time::Duration::from_millis(100));             }         });     }).unwrap();      for _ in 0..n_msgs {         let msg = rcv.recv().unwrap();         println!(\"{}\", msg);     } }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/lazy_static\/\">lazy_static<\/a>. \u041c\u0430\u043a\u0440\u043e\u0441 <code>lazy_static!<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e <code>static ref<\/code>, \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/sync\/struct.Mutex.html\">Mutex<\/a> (\u0441\u043c. \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/doc.rust-lang.org\/std\/sync\/struct.RwLock.html\">RwLock<\/a>). \u041e\u0431\u0435\u0440\u0442\u043a\u0430 <code>Mutex<\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u043e\u043d\u043a\u0438 \u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0432 <code>Mutex<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/doc.rust-lang.org\/std\/sync\/struct.MutexGuard.html\">MutexGuard<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use lazy_static::lazy_static; use std::sync::Mutex;  error_chain! {}  lazy_static! {     static ref FRUIT: Mutex&lt;Vec&lt;String>> = Mutex::new(Vec::new()); }  fn insert(fruit: &amp;str) -> Result&lt;()> {     let mut db = FRUIT.lock().map_err(|_| \"Failed to acquire MutexGuard\")?;     db.push(fruit.to_string());     Ok(()) }  fn main() -> Result&lt;()> {     insert(\"apple\")?;     insert(\"orange\")?;     insert(\"peach\")?;     {         \/\/ \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439         let db = FRUIT.lock().map_err(|_| \"Failed to acquire MutexGuard\")?;          db.iter()             .enumerate()             .for_each(|(i, item)| println!(\"{}: {}\", i, item));     }     insert(\"grape\")?;     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"42-parallelnaya-obrabotka-dannyh\">4.2. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>  <\/p>\n<p><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.rs\/rayon\/latest\/rayon\/\">rayon<\/a> \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>Rust<\/code> \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. <code>rayon<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.IntoParallelRefMutIterator.html#tymethod.par_iter_mut\">par_iter_mut<\/a> \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. <code>par_iter_mut<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 (iterator-like chain), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rayon::prelude::*;  fn main() {     let mut arr = [0, 7, 9, 11];     arr.par_iter_mut().for_each(|p| *p -= 1);     println!(\"{:?}\", arr); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.ParallelIterator.html#method.any\">rayon::any<\/a> \u0438 <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.ParallelIterator.html#method.all\">rayon::all<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f &#171;\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c\u0438&#187; \u0430\u043d\u0430\u043b\u043e\u0433\u0430\u043c\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/iter\/trait.Iterator.html#method.any\">std::any<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/iter\/trait.Iterator.html#method.all\">std::all<\/a>. <code>rayon::any<\/code> \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d. <code>rayon::all<\/code> \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u043b\u0438 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u043d\u0435\u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rayon::prelude::*;  fn main() {     let mut vec = vec![2, 4, 6, 8];      assert!(!vec.par_iter().any(|n| (*n % 2) != 0));     assert!(vec.par_iter().all(|n| (*n % 2) == 0));     assert!(!vec.par_iter().any(|n| *n > 8 ));     assert!(vec.par_iter().all(|n| *n &lt;= 8 ));      vec.push(9);      assert!(vec.par_iter().any(|n| (*n % 2) != 0));     assert!(!vec.par_iter().all(|n| (*n % 2) == 0));     assert!(vec.par_iter().any(|n| *n > 8 ));     assert!(!vec.par_iter().all(|n| *n &lt;= 8 )); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.ParallelIterator.html#method.find_any\">rayon::find_any<\/a> \u0438 <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.IntoParallelRefIterator.html#tymethod.par_iter\">par_iter<\/a> \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<p><code>rayon::find_any<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0441\u043e\u0432\u043f\u0430\u0432\u0448\u0438\u0439 \u0441 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c.<\/p>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>, \u0447\u0442\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0438 \u2014 \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0443 (<code>&amp;&amp;x<\/code>). \u0421\u043c. \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/iter\/trait.Iterator.html#method.find\">std::find<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rayon::prelude::*;  fn main() {     let v = vec![6, 2, 1, 9, 3, 8, 11];      let f1 = v.par_iter().find_any(|&amp;&amp;x| x == 9);     let f2 = v.par_iter().find_any(|&amp;&amp;x| x % 2 == 0 &amp;&amp; x > 6);     let f3 = v.par_iter().find_any(|&amp;&amp;x| x > 8);      assert_eq!(f1, Some(&amp;9));     assert_eq!(f2, Some(&amp;8));     assert!(f3 > Some(&amp;8)); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u041c\u0435\u0442\u043e\u0434 <code>par_iter_mut().for_each<\/code> \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0425\u043e\u0442\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/slice\/trait.ParallelSliceMut.html\">\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432<\/a> \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/slice\/trait.ParallelSliceMut.html#method.par_sort_unstable\">par_iter_unstable<\/a>, \u043e\u0431\u044b\u0447\u043d\u043e, \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/slice\/trait.ParallelSliceMut.html#method.par_sort\">\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rand::distributions::Alphanumeric; use rand::{thread_rng, Rng}; use rayon::prelude::*;  fn main() {     let mut vec = vec![String::new(); 100];     vec.par_iter_mut().for_each(|p| {         let mut rng = thread_rng();          *p = (0..5)             \/\/ \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438             .map(|_| rng.sample(&amp;Alphanumeric))             .map(char::from)             .collect()     });     vec.par_sort_unstable();     println!(\"{:?}\", vec); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 map-reduce<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.ParallelIterator.html#method.filter\">rayon::filter<\/a>, <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.ParallelIterator.html#method.map\">rayon::map<\/a> \u0438 <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.ParallelIterator.html#method.reduce\">rayon::reduce<\/a> \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430 \u043b\u044e\u0434\u0435\u0439 (\u043e\u0431\u044a\u0435\u043a\u0442 <code>Person<\/code>) \u0441\u0442\u0430\u0440\u0448\u0435 30 (\u043f\u043e\u043b\u0435 <code>age<\/code>).<\/p>\n<p>  <\/p>\n<p><code>rayon::filter<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443. <code>rayon::map<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043d\u043e\u0432\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. <code>rayon::reduce<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.ParallelIterator.html#method.sum\">rayon::sum<\/a> \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rayon::prelude::*;  struct Person {     age: u32, }  fn main() {     let v: Vec&lt;Person> = vec![         Person { age: 23 },         Person { age: 19 },         Person { age: 42 },         Person { age: 17 },         Person { age: 17 },         Person { age: 31 },         Person { age: 30 },     ];      let num_over_30 = v.par_iter().filter(|&amp;x| x.age > 30).count() as f32;     let sum_over_30 = v.par_iter()         .map(|x| x.age)         .filter(|&amp;x| x > 30)         .reduce(|| 0, |x, y| x + y);      let alt_sum_30: u32 = v.par_iter()         .map(|x| x.age)         .filter(|&amp;x| x > 30)         .sum();      let avg_over_30 = sum_over_30 as f32 \/ num_over_30;     let alt_avg_over_30 = alt_sum_30 as f32\/ num_over_30;      \/\/ \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439     assert!((avg_over_30 - alt_avg_over_30).abs() &lt; std::f32::EPSILON);     println!(\"The average age of people older than 30 is {}\", avg_over_30); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JPG<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 <code>.jpg<\/code> \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>thumbnails<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/glob\/*\/glob\/fn.glob_with.html\">glob::glob_with<\/a> \u0438\u0449\u0435\u0442 \u0444\u0430\u0439\u043b\u044b <code>.jpg<\/code> \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438. <a href=\"https:\/\/docs.rs\/rayon\/1.8.1\/rayon\">rayon<\/a> \u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/image\/*\/image\/enum.DynamicImage.html#method.resize\">DynamicImage::resize<\/a>. \u041e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/rayon\/*\/rayon\/iter\/trait.IntoParallelRefIterator.html#tymethod.par_iter\">par_iter<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use std::fs::create_dir_all; use std::path::Path;  use error_chain::ChainedError; use glob::{glob_with, MatchOptions}; use image::{imageops::FilterType, ImageError}; use rayon::prelude::*;  error_chain! {     foreign_links {         Image(ImageError);         Io(std::io::Error);         Glob(glob::PatternError);     } }  fn main() -> Result&lt;()> {     let options: MatchOptions = Default::default();     \/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b JPG \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438     let files: Vec&lt;_> = glob_with(\"*.jpg\", options)?         .filter_map(|x| x.ok())         .collect();      \/\/ \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0435\u0442     if files.len() == 0 {         error_chain::bail!(\"No .jpg files found in current directory\");     }      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     let thumb_dir = \"thumbnails\";     create_dir_all(thumb_dir)?;      println!(\"Saving {} thumbnails into '{}'...\", files.len(), thumb_dir);      \/\/ \u0412\u0435\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0432\u0430\u043b\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440     let image_failures: Vec&lt;_> = files         .par_iter()         .map(|path| {             \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f             make_thumbnail(path, thumb_dir, 300)                 .map_err(|e| e.chain_err(|| path.display().to_string()))         })         .filter_map(|x| x.err())         .collect();      image_failures         .iter()         .for_each(|x| println!(\"{}\", x.display_chain()));      println!(         \"{} thumbnails saved successfully\",         files.len() - image_failures.len()     );     Ok(()) }  fn make_thumbnail&lt;PA, PB>(original: PA, thumb_dir: PB, longest_edge: u32) -> Result&lt;()> where     PA: AsRef&lt;Path>,     PB: AsRef&lt;Path>, {     \/\/ \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f     let img = image::open(original.as_ref())?;     \/\/ \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443     let file_path = thumb_dir.as_ref().join(original);      \/\/ \u041f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043e 300 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438     \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     Ok(img         .resize(longest_edge, longest_edge, FilterType::Nearest)         .save(file_path)?) }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"5-kriptografiya\">5. \u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f<\/h1>\n<p>  <\/p>\n<h2 id=\"51-heshirovanie\">5.1. \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p><strong>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 SHA-256<\/strong><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b, \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c SHA-256 <a href=\"https:\/\/briansmith.org\/rustdoc\/ring\/digest\/struct.Digest.html\">digest::Digest<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/briansmith.org\/rustdoc\/ring\/digest\/struct.Context.html\">digest::Context<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use data_encoding::HEXUPPER; use ring::digest::{Context, Digest, SHA256}; use std::fs::File; use std::io::{BufReader, Read, Write};  error_chain! {     foreign_links {         Io(std::io::Error);         Decode(data_encoding::DecodeError);     } }  \/\/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u0442 digest \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 SHA-256 fn sha256_digest&lt;R: Read>(mut reader: R) -> Result&lt;Digest> {     let mut context = Context::new(&amp;SHA256);     let mut buffer = [0; 1024];      loop {         let count = reader.read(&amp;mut buffer)?;         if count == 0 {             break;         }         context.update(&amp;buffer[..count]);     }      Ok(context.finish()) }  fn main() -> Result&lt;()> {     let path = \"file.txt\";      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430     let mut output = File::create(path)?;     \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b     write!(output, \"We will generate a digest of this text\")?;      let input = File::open(path)?;     \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430     let reader = BufReader::new(input);     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c digest     let digest = sha256_digest(reader)?;      println!(\"SHA-256 digest is {}\", HEXUPPER.encode(digest.as_ref()));      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e HMAC digest<\/strong><\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/briansmith.org\/rustdoc\/ring\/hmac\/\">ring::hmac<\/a> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <a href=\"https:\/\/briansmith.org\/rustdoc\/ring\/hmac\/struct.Signature.html\">hmac::Signature<\/a> \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use ring::{hmac, rand}; use ring::rand::SecureRandom; use ring::error::Unspecified;  fn main() -> Result&lt;(), Unspecified> {     let mut key_value = [0u8; 48];     let rng = rand::SystemRandom::new();     rng.fill(&amp;mut key_value)?;     let key = hmac::Key::new(hmac::HMAC_SHA256, &amp;key_value);      let message = \"Legitimate important message\";     \/\/ \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443     let signature = hmac::sign(&amp;key, message.as_bytes());     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0438     hmac::verify(&amp;key, message.as_bytes(), signature.as_ref())?;      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"52-shifrovanie\">5.2. \u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u043b\u0435\u043d\u0438\u0435 \u0438 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e PBKDF2<\/strong><\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/briansmith.org\/rustdoc\/ring\/pbkdf2\/index.html\">ring::pbkdf2<\/a> \u0434\u043b\u044f \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#171;\u0437\u0430\u0441\u043e\u043b\u0435\u043d\u043d\u043e\u0433\u043e&#187; (salted) \u043f\u0430\u0440\u043e\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 <a href=\"https:\/\/briansmith.org\/rustdoc\/ring\/pbkdf2\/fn.derive.html\">pbkdf2::derive<\/a>. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/briansmith.org\/rustdoc\/ring\/pbkdf2\/fn.verify.html\">pbkdf2::verify<\/a>. \u0421\u043e\u043b\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/briansmith.org\/rustdoc\/ring\/rand\/trait.SecureRandom.html#tymethod.fill\">SecureRandom::fill<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442\u043e\u0432 \u0441\u043e\u043b\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use data_encoding::HEXUPPER; use ring::error::Unspecified; use ring::rand::SecureRandom; use ring::{digest, pbkdf2, rand}; use std::num::NonZeroU32;  fn main() -> Result&lt;(), Unspecified> {     const CREDENTIAL_LEN: usize = digest::SHA512_OUTPUT_LEN;     let n_iter = NonZeroU32::new(100_000).unwrap();     let rng = rand::SystemRandom::new();      let mut salt = [0u8; CREDENTIAL_LEN];     rng.fill(&amp;mut salt)?;      let password = \"Guess Me If You Can!\";     let mut pbkdf2_hash = [0u8; CREDENTIAL_LEN];     \/\/ \u0425\u0435\u0448\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u043e\u043b\u044c     pbkdf2::derive(         pbkdf2::PBKDF2_HMAC_SHA512,         n_iter,         &amp;salt,         password.as_bytes(),         &amp;mut pbkdf2_hash,     );     println!(\"Salt: {}\", HEXUPPER.encode(&amp;salt));     println!(\"PBKDF2 hash: {}\", HEXUPPER.encode(&amp;pbkdf2_hash));     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448\u0430     let should_succeed = pbkdf2::verify(         pbkdf2::PBKDF2_HMAC_SHA512,         n_iter,         &amp;salt,         password.as_bytes(),         &amp;pbkdf2_hash,     );     let wrong_password = \"Definitely not the correct password\";     let should_fail = pbkdf2::verify(         pbkdf2::PBKDF2_HMAC_SHA512,         n_iter,         &amp;salt,         wrong_password.as_bytes(),         &amp;pbkdf2_hash,     );      assert!(should_succeed.is_ok());     assert!(!should_fail.is_ok());      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"7-baza-dannyh\">7. \u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/h1>\n<p>  <\/p>\n<h2 id=\"71-sqlite\">7.1. SQLite<\/h2>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0411\u0414 SQLite<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/rusqlite\/latest\/rusqlite\/\">rusqlite<\/a> \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0411\u0414 <code>SQLite<\/code>. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0435\u0439 \u043a\u043e\u0434\u0430 \u0432 <code>Windows<\/code>, \u0438\u0449\u0438\u0442\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/jgallagher\/rusqlite#user-content-notes-on-building-rusqlite-and-libsqlite3-sys\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Connection.html#method.open\">Connection::open<\/a> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0411\u0414 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rusqlite::{Connection, Result};  fn main() -> Result&lt;()> {     \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0411\u0414 `cats`     let conn = Connection::open(\"cats.sqlite\")?;      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 `cat_colors`     conn.execute(         \"create table if not exists cat_colors (              id integer primary key,              name text not null unique          )\",         (),     )?;     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 `cats`     conn.execute(         \"create table if not exists cats (              id integer primary key,              name text not null,              color_id integer not null references cat_colors(id)          )\",         (),     )?;      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Connection.html#method.open\">Connection::open<\/a> \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0411\u0414 <code>cats<\/code>, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Connection.html#method.execute\">Connection::execute<\/a> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>cat_colors<\/code> \u0438 <code>cats<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0446\u0432\u0435\u0442\u0435, \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Connection.html#method.last_insert_rowid\">Connection::last_insert_rowid<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <code>id<\/code> \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u042d\u0442\u043e\u0442 <code>id<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>cats<\/code>. \u0417\u0430\u0442\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Connection.html#method.prepare\">prepare<\/a> \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (select query). <code>prepare<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Statement.html\">Statement<\/a>. \u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Statement.html#method.query_map\">Statement::query_map<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rusqlite::{Connection, Result}; use std::collections::HashMap;  #[derive(Debug)] struct Cat {     name: String,     color: String, }  fn main() -> Result&lt;()> {     \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0411\u0414 `cats`     let conn = Connection::open(\"cats.sqlite\")?;      let mut cat_colors = HashMap::new();     cat_colors.insert(String::from(\"Blue\"), vec![\"Tigger\", \"Sammy\"]);     cat_colors.insert(String::from(\"Black\"), vec![\"Oreo\", \"Biscuit\"]);      \/\/ \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u0430\u0440\u0442\u044b     for (color, catnames) in &amp;cat_colors {         \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 `cat_colors`         conn.execute(             \"INSERT INTO cat_colors (name) values (?1)\",             &amp;[&amp;color.to_string()],         )?;         let last_id: String = conn.last_insert_rowid().to_string();          \/\/ \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043c\u0435\u043d\u0430 \u043a\u043e\u0448\u0435\u043a         for cat in catnames {             \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 `cats`             conn.execute(                 \"INSERT INTO cats (name, color_id) values (?1, ?2)\",                 &amp;[&amp;cat.to_string(), &amp;last_id],             )?;         }     }     \/\/ \u0417\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445     let mut stmt = conn.prepare(         \"SELECT c.name, cc.name from cats c          INNER JOIN cat_colors cc          ON cc.id = c.color_id;\",     )?;     \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     let cats = stmt.query_map((), |row| {         Ok(Cat {             name: row.get(0)?,             color: row.get(1)?,         })     })?;      for cat in cats {         println!(\"Found cat {:?}\", cat);     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439<\/strong><\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Connection.html#method.open\">Connection::open<\/a> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414 <code>cats<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Connection.html#method.transaction\">Connection::transaction<\/a> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e. \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u044f\u0432\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/rusqlite\/*\/rusqlite\/struct.Transaction.html#method.commit\">Transaction::commit<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0446\u0432\u0435\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439\u0441\u044f \u0446\u0432\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f (roll back).<\/p>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0411\u0414 <code>cats<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use rusqlite::{Connection, Result};  #[derive(Debug)] struct Cat {     name: String,     color: String, }  fn main() -> Result&lt;()> {     \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0411\u0414 `cats`     let mut conn = Connection::open(\"cats.sqlite\")?;     \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e     successful_tx(&amp;mut conn)?;     \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \"\u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f\" \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e     let res = rolled_back_tx(&amp;mut conn);     assert!(res.is_err());      Ok(()) }  \/\/ \u0423\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f fn successful_tx(conn: &amp;mut Connection) -> Result&lt;()> {     let tx = conn.transaction()?;      tx.execute(\"delete from cat_colors\", ())?;     tx.execute(\"insert into cat_colors (name) values (?1)\", &amp;[&amp;\"lavender\"])?;     tx.execute(\"insert into cat_colors (name) values (?1)\", &amp;[&amp;\"blue\"])?;      tx.commit() } \/\/ \u041e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f fn rolled_back_tx(conn: &amp;mut Connection) -> Result&lt;()> {     let tx = conn.transaction()?;      tx.execute(\"delete from cat_colors\", ())?;     tx.execute(\"insert into cat_colors (name) values (?1)\", &amp;[&amp;\"lavender\"])?;     tx.execute(\"insert into cat_colors (name) values (?1)\", &amp;[&amp;\"blue\"])?;     \/\/ \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u043e\u0442\u043a\u0430\u0442\u0443 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438     tx.execute(\"insert into cat_colors (name) values (?1)\", &amp;[&amp;\"lavender\"])?;      tx.commit() }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"72-postgres\">7.2. Postgres<\/h2>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/strong><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0411\u0414 <code>PostgreSQL<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/postgres\/0.17.2\/postgres\/\">postgres<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/postgres\/0.17.2\/postgres\/struct.Client.html#method.connect\">Client::connect<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0411\u0414. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f URL \u0411\u0414 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0411\u0414 <code>library<\/code>, \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <code>postgres<\/code> \u0438 \u043f\u0430\u0440\u043e\u043b\u044c <code>postgres<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use postgres::{Client, NoTls, Error};  fn main() -> Result&lt;(), Error> {     \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0411\u0414 `library`     let mut client = Client::connect(\"postgresql:\/\/postgres:postgres@localhost\/library\", NoTls)?;      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 `author`     client.batch_execute(\"         CREATE TABLE IF NOT EXISTS author (             id              SERIAL PRIMARY KEY,             name            VARCHAR NOT NULL,             country         VARCHAR NOT NULL             )     \")?;     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 `book`     client.batch_execute(\"         CREATE TABLE IF NOT EXISTS book  (             id              SERIAL PRIMARY KEY,             title           VARCHAR NOT NULL,             author_id       INTEGER NOT NULL REFERENCES author             )     \")?;      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/postgres\/0.17.2\/postgres\/struct.Client.html#method.execute\">Client::execute<\/a>. \u0414\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/postgres\/0.17.2\/postgres\/struct.Client.html#method.query\">Client::query<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use postgres::{Client, Error, NoTls}; use std::collections::HashMap;  struct Author {     _id: i32,     name: String,     country: String, }  fn main() -> Result&lt;(), Error> {     \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0411\u0414 `library`     let mut client = Client::connect(\"postgresql:\/\/postgres:postgres@localhost\/library\", NoTls)?;      let mut authors = HashMap::new();     authors.insert(String::from(\"Chinua Achebe\"), \"Nigeria\");     authors.insert(String::from(\"Rabindranath Tagore\"), \"India\");     authors.insert(String::from(\"Anita Nair\"), \"India\");     \/\/ \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 `author`     client.execute(\"DELETE FROM author\", &amp;[])?;     \/\/ \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u0430\u0440\u0442\u044b \u0430\u0432\u0442\u043e\u0440\u043e\u0432     for (key, value) in &amp;authors {         let author = Author {             _id: 0,             name: key.to_string(),             country: value.to_string(),         };         \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 `author`         client.execute(             \"INSERT INTO author (name, country) VALUES ($1, $2)\",             &amp;[&amp;author.name, &amp;author.country],         )?;     }      \/\/ \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445     for row in client.query(\"SELECT id, name, country FROM author\", &amp;[])? {         let author = Author {             _id: row.get(0),             name: row.get(1),             country: row.get(2),         };         println!(\"Author {} is from {}\", author.name, author.country);     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"8-data-i-vremya\">8. \u0414\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f<\/h1>\n<p>  <\/p>\n<h2 id=\"81-prodolzhitelnost-i-vychislenie-daty-i-vremeni\">8.1. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/h2>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f <a href=\"https:\/\/doc.rust-lang.org\/std\/time\/struct.Instant.html#method.elapsed\">time::Instant::elapsed<\/a>, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441 <a href=\"https:\/\/doc.rust-lang.org\/std\/time\/struct.Instant.html#method.now\">time::Instant::now<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>time::Instant::elapsed<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/time\/struct.Duration.html\">time::Duration<\/a>. \u0412\u044b\u0437\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0438 \u043d\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/time\/struct.Instant.html\">time::Instant<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::time::{Duration, Instant}; use std::thread;  \/\/ \"\u0414\u043e\u0440\u043e\u0433\u0430\u044f\" \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u044f fn expensive_function() {     \/\/ \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 1 \u0441\u0435\u043a     thread::sleep(Duration::from_secs(1)); }  fn main() {     let start = Instant::now();     expensive_function();     \/\/ \u0418\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438     let duration = start.elapsed();      println!(\"Time elapsed in expensive_function() is: {:?}\", duration); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0435 \u043d\u0435\u0434\u0435\u043b\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.Date.html#method.checked_add_signed\">DateTime::checked_add_signed<\/a> \u0438 \u0434\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u043d\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.Date.html#method.checked_sub_signed\">DateTime::checked_sub_signed<\/a>. \u042d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 <code>None<\/code>, \u0435\u0441\u043b\u0438 \u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>Escape-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.format\">DateTime::format<\/a>, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/format\/strftime\/index.html\">Chronic::format::strftime<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use chrono::{DateTime, Duration, Utc};  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u043d\u044f fn day_earlier(date_time: DateTime&lt;Utc>) -> Option&lt;DateTime&lt;Utc>> {     date_time.checked_sub_signed(Duration::days(1)) }  fn main() {     let now = Utc::now();     println!(\"{}\", now);      \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c 2 \u043d\u0435\u0434\u0435\u043b\u0438     let almost_three_weeks_from_now = now.checked_add_signed(Duration::weeks(2))             \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u0434\u0435\u043b\u044e             .and_then(|in_2weeks| in_2weeks.checked_add_signed(Duration::weeks(1)))             \/\/ \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u0435\u043d\u044c             .and_then(day_earlier);      match almost_three_weeks_from_now {         Some(x) => println!(\"{}\", x),         None => eprintln!(\"Almost three weeks from now overflows!\"),     }      \/\/ \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0430\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c     match now.checked_add_signed(Duration::max_value()) {         Some(x) => println!(\"{}\", x),         None => eprintln!(\"We can't use chrono to tell the time for the Solar System to complete more than one full orbit around the galactic center.\"),     } }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0437\u043e\u043d\u0443<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/offset\/struct.Local.html#method.now\">offset::Local::now<\/a> \u0438 \u0435\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 <code>UTC<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.from_utc\">DateTime::from_utc<\/a>. \u0417\u0430\u0442\u0435\u043c <code>UTC-\u0432\u0440\u0435\u043c\u044f<\/code> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 <code>UTC+8<\/code> \u0438 <code>UTC-2<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/offset\/struct.FixedOffset.html\">offset:FixedOffset<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use chrono::{DateTime, FixedOffset, Local, Utc};  fn main() {     \/\/ \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f     let local_time = Local::now();     \/\/ \u0412\u0440\u0435\u043c\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 UTC     let utc_time = DateTime::&lt;Utc>::from_utc(local_time.naive_utc(), Utc);     \/\/ \u0412\u0440\u0435\u043c\u044f UTC+8     let china_timezone = FixedOffset::east(8 * 3600);     \/\/ \u0412\u0440\u0435\u043c\u044f UTC-2     let rio_timezone = FixedOffset::west(2 * 3600);     println!(\"Local time now is {}\", local_time);     println!(\"UTC time now is {}\", utc_time);     println!(         \"Time in Hong Kong now is {}\",         utc_time.with_timezone(&amp;china_timezone)     );     println!(\"Time in Rio de Janeiro now is {}\", utc_time.with_timezone(&amp;rio_timezone)); }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"82-razbor-i-otobrazhenie-daty-i-vremeni\">8.2. \u0420\u0430\u0437\u0431\u043e\u0440 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/h2>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html\">DateTime<\/a> \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 UTC, \u0435\u0433\u043e \u0447\u0430\u0441\u043e\u0432\/\u043c\u0438\u043d\u0443\u0442\/\u0441\u0435\u043a\u0443\u043d\u0434 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/trait.Timelike.html\">Timelike<\/a> \u0438 \u043b\u0435\u0442\/\u043c\u0435\u0441\u044f\u0446\u0435\u0432\/\u0434\u043d\u0435\u0439 \u043d\u0435\u0434\u0435\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/trait.Datelike.html\">Datelike<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use chrono::{Datelike, Timelike, Utc};  fn main() {     let now = Utc::now();      let (is_pm, hour) = now.hour12();     println!(         \"The current UTC time is {:02}:{:02}:{:02} {}\",         hour,         now.minute(),         now.second(),         if is_pm { \"PM\" } else { \"AM\" }     );     \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0435 \u0441 \u043f\u043e\u043b\u0443\u043d\u043e\u0447\u0438     println!(         \"And there have been {} seconds since midnight\",         now.num_seconds_from_midnight()     );      let (is_common_era, year) = now.year_ce();     println!(         \"The current UTC date is {}-{:02}-{:02} {:?} ({})\",         year,         now.month(),         now.day(),         now.weekday(),         if is_common_era { \"CE\" } else { \"BCE\" }     );     \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043d\u0435\u0439, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u043e\u0432\u043e\u0439 \u044d\u0440\u044b     println!(         \"And the Common Era began {} days ago\",         now.num_days_from_ce()     ); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0432 \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 UNIX \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0438\u0437 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/naive\/struct.NaiveDate.html#method.from_ymd\">NaiveDate::from_ymd<\/a> \u0438 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/naive\/struct.NaiveTime.html#method.from_hms\">NaiveTime::from_hms<\/a> \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Unix_time\">\u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (timestamp) UNIX<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/naive\/struct.NaiveDateTime.html#method.timestamp\">NaiveDateTime::timestamp<\/a> \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0441\u043f\u0443\u0441\u0442\u044f \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0441\u043b\u0435 <code>1970-01-01 0:00:00 UTC<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/naive\/struct.NaiveDateTime.html#method.from_timestamp\">NaiveDateTime::from_timestamp<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use chrono::{NaiveDate, NaiveDateTime};  fn main() {     let date_time: NaiveDateTime = NaiveDate::from_ymd(2017, 11, 12).and_hms(17, 33, 44);     println!(         \"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043c\u0435\u0436\u0434\u0443 1970-01-01 00:00:00 \u0438 {} \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f {}.\",         date_time, date_time.timestamp());      let date_time_after_a_billion_seconds = NaiveDateTime::from_timestamp(1_000_000_000, 0);     println!(         \"\u0414\u0430\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0441\u043b\u0435 1970-01-01 00:00:00: {}.\",         date_time_after_a_billion_seconds); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0430\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>UTC<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/offset\/struct.Utc.html#method.now\">Utc::now<\/a> \u0438 \u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b <a href=\"https:\/\/www.ietf.org\/rfc\/rfc2822.txt\">RFC 2822<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.to_rfc2822\">DateTime::to_rfc2822<\/a> \u0438 <a href=\"https:\/\/www.ietf.org\/rfc\/rfc3339.txt\">RFC 3339<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.to_rfc3339\">DateTime::to_rfc3339<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.format\">DateTime::format<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use chrono::{DateTime, Utc};  fn main() {     let now: DateTime&lt;Utc> = Utc::now();      println!(\"UTC now is: {}\", now);     println!(\"UTC now in RFC 2822 is: {}\", now.to_rfc2822());     println!(\"UTC now in RFC 3339 is: {}\", now.to_rfc3339());     println!(\"UTC now in a custom format is: {}\", now.format(\"%a %b %e %T %Y\")); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 DateTime<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html\">DateTime<\/a>, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b <code>RFC 2822<\/code>, <code>RFC 3339<\/code> \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.parse_from_rfc2822\">DateTime::parse_from_rfc2822<\/a>, <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.parse_from_rfc3339\">DateTime::parse_from_rfc3339<\/a> \u0438 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.parse_from_str\">DateTime::parse_from_str<\/a>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>Escape-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.parse_from_str\">DateTime::parse_from_str<\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/format\/strftime\/index.html\">chrono::format::strftime<\/a>. <em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>, \u0447\u0442\u043e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.parse_from_str\">DateTime::parse_from_str<\/a> \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>DateTime<\/code> \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0434\u0430\u0442\u0443 \u0438 \u0432\u0440\u0435\u043c\u044f. \u0414\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u0435\u0437 \u0447\u0430\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u044f\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/naive\/struct.NaiveDate.html\">NaiveDate<\/a>, <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/naive\/struct.NaiveTime.html\">NaiveTime<\/a> \u0438 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/naive\/struct.NaiveDateTime.html\">NaiveDateTime<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime}; use chrono::format::ParseError;  fn main() -> Result&lt;(), ParseError> {     let rfc2822 = DateTime::parse_from_rfc2822(\"Tue, 1 Jul 2003 10:52:37 +0200\")?;     println!(\"{}\", rfc2822);      let rfc3339 = DateTime::parse_from_rfc3339(\"1996-12-19T16:39:57-08:00\")?;     println!(\"{}\", rfc3339);      let custom = DateTime::parse_from_str(\"5.8.1994 8:00 am +0000\", \"%d.%m.%Y %H:%M %P %z\")?;     println!(\"{}\", custom);      let time_only = NaiveTime::parse_from_str(\"23:56:04\", \"%H:%M:%S\")?;     println!(\"{}\", time_only);      let date_only = NaiveDate::parse_from_str(\"2015-09-05\", \"%Y-%m-%d\")?;     println!(\"{}\", date_only);      let no_timezone = NaiveDateTime::parse_from_str(\"2015-09-05 23:56:04\", \"%Y-%m-%d %H:%M:%S\")?;     println!(\"{}\", no_timezone);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"9-instrumenty-dlya-razrabotki\">9. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h1>\n<p>  <\/p>\n<h2 id=\"91-otladka\">9.1. \u041e\u0442\u043b\u0430\u0434\u043a\u0430<\/h2>\n<p>  <\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c<\/strong><\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/log\/0.4.20\/log\/\">log<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/env_logger\/latest\/env_logger\/\">env_logger<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041c\u0430\u043a\u0440\u043e\u0441 <a href=\"https:\/\/docs.rs\/log\/*\/log\/macro.debug.html\">log::debug!<\/a> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <a href=\"https:\/\/doc.rust-lang.org\/std\/fmt\/\">std::fmt<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn execute_query(query: &amp;str) {     log::debug!(\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430: {}\", query); }  fn main() {     env_logger::init();      execute_query(\"DROP TABLE students\"); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>error<\/code>, \u0430 \u0443\u0440\u043e\u0432\u043d\u0438 \u043d\u0438\u0436\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>RUST_LOG<\/code> \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>debug<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">RUST_LOG=debug cargo run<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <a href=\"https:\/\/docs.rs\/log\/*\/log\/macro.error.html\">log::error!<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\"> fn execute_query(_query: &amp;str) -> Result&lt;(), &amp;'static str> {     Err(\"\u0411\u043e\u044e\u0441\u044c, \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\") }  fn main() {     env_logger::init();      let response = execute_query(\"DROP TABLE students\");     if let Err(err) = response {         log::error!(\"\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c: {}\", err);     } }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 stdout \u0432\u043c\u0435\u0441\u0442\u043e stderr<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/struct.Builder.html#method.target\">Builder::target<\/a> \u2014 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0446\u0435\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/fmt\/enum.Target.html\">Target::Stdout<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use env_logger::{Builder, Target};  fn main() {     Builder::new()         .target(Target::Stdout)         .init();      log::error!(\"\u042d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 stdout\"); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0435\u0440\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0435\u0440\u0430 <code>ConsoleLogger<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 stdout. <code>ConsoleLogger<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/log\/*\/log\/trait.Log.html\">log::Log<\/a> \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. <a href=\"https:\/\/docs.rs\/log\/*\/log\/fn.set_logger.html\">log::set_logger<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 <code>ConsoleLogger<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use log::{Record, Level, Metadata, LevelFilter, SetLoggerError};  static CONSOLE_LOGGER: ConsoleLogger = ConsoleLogger;  struct ConsoleLogger;  impl log::Log for ConsoleLogger {     fn enabled(&amp;self, metadata: &amp;Metadata) -> bool {         metadata.level() &lt;= Level::Info     }      fn log(&amp;self, record: &amp;Record) {         if self.enabled(record.metadata()) {             println!(\"Rust \u0433\u043e\u0432\u043e\u0440\u0438\u0442: {} - {}\", record.level(), record.args());         }     }      fn flush(&amp;self) {} }  fn main() -> Result&lt;(), SetLoggerError> {     log::set_logger(&amp;CONSOLE_LOGGER)?;     log::set_max_level(LevelFilter::Info);      log::info!(\"\u043f\u0440\u0438\u0432\u0435\u0442\");     log::warn!(\"\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\");     log::error!(\"\u0443\u043f\u0441\");     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0430 \u043c\u043e\u0434\u0443\u043b\u044f: <code>foo<\/code> \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 <code>foo::bar<\/code>. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/#enabling-logging\">RUST_LOG<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">mod foo {     mod bar {         pub fn run() {             log::warn!(\"[bar] warn\");             log::info!(\"[bar] info\");             log::debug!(\"[bar] debug\");         }     }      pub fn run() {         log::warn!(\"[foo] warn\");         log::info!(\"[foo] info\");         log::debug!(\"[foo] debug\");         bar::run();     } }  fn main() {     env_logger::init();     log::warn!(\"[root] warn\");     log::info!(\"[root] info\");     log::debug!(\"[root] debug\");     foo::run(); }<\/code><\/pre>\n<p>  <\/p>\n<p><code>RUST_LOG<\/code> \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u043e\u043c <a href=\"https:\/\/docs.rs\/env_logger\/\">env_logger<\/a>. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>test<\/code>):<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">RUST_LOG=\"warn,test::foo=info,test::foo::bar=debug\" .\/test<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 <a href=\"https:\/\/docs.rs\/log\/*\/log\/enum.Level.html\">log::level<\/a> \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>warn<\/code>, \u0443\u0440\u043e\u0432\u043d\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 <code>foo<\/code> \u0438 <code>foo::bar<\/code> \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>info<\/code> \u0438 <code>debug<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">WARN:test: [root] warn WARN:test::foo: [foo] warn INFO:test::foo: [foo] info WARN:test::foo::bar: [bar] warn INFO:test::foo::bar: [bar] info DEBUG:test::foo::bar: [bar] debug<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/strong><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/struct.Builder.html\">Builder<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/struct.Builder.html#method.parse\">Builder::parse<\/a> \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>MY_APP_LOG<\/code> \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/#enabling-logging\">RUST_LOG<\/a>. \u0417\u0430\u0442\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/struct.Builder.html#method.init\">Builder::init<\/a> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043b\u043e\u0433\u0435\u0440. \u041e\u0431\u044b\u0447\u043d\u043e, \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/fn.init.html\">env_logger::init<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::env; use env_logger::Builder;  fn main() {     Builder::new()         .parse(&amp;env::var(\"MY_APP_LOG\").unwrap_or_default())         .init();      log::info!(\"\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\");     log::warn!(\"\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\");     log::error!(\"\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 {}\", \"\u043e\u0448\u0438\u0431\u043a\u0435\"); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0442\u043b\u0430\u0434\u043a\u0435<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043b\u043e\u0433\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/struct.Builder.html\">Builder<\/a>. \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/offset\/struct.Local.html#method.now\">Local::now<\/a> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/datetime\/struct.DateTime.html\">DateTime<\/a> \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u043e\u043d\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/struct.DateTime.html#method.format\">DateTime::format<\/a> \u0441 <a href=\"https:\/\/docs.rs\/chrono\/*\/chrono\/format\/strftime\/index.html#specifiers\">strftime:specifiers<\/a> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0435.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/env_logger\/*\/env_logger\/struct.Builder.html#method.format\">Builder::format<\/a> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0432 \u043d\u0435\u0433\u043e \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, <a href=\"https:\/\/docs.rs\/log\/*\/log\/struct.Record.html#method.level\">Record::level<\/a> \u0438 \u0442\u0435\u043b\u043e (<a href=\"https:\/\/docs.rs\/log\/*\/log\/struct.Record.html#method.args\">Record::args<\/a>).<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::io::Write; use chrono::Local; use env_logger::Builder; use log::LevelFilter;  fn main() {     Builder::new()         .format(|buf, record| {             writeln!(buf,                 \"{} [{}] - {}\",                 Local::now().format(\"%Y-%m-%dT%H:%M:%S\"),                 record.level(),                 record.args()             )         })         .filter(None, LevelFilter::Info)         .init();      log::warn!(\"warn\");     log::info!(\"info\");     log::debug!(\"debug\"); }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"92-versionirovanie\">9.2. \u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p><strong>\u0420\u0430\u0437\u0431\u043e\u0440 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.Version.html\">semver::Version<\/a> \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.Version.html#method.parse\">Version::parse<\/a>, \u0437\u0430\u0442\u0435\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0442\u0447\u0435\u0432\u044b\u0439, \u043c\u0438\u043d\u043e\u0440\u043d\u044b\u0439 \u0438 \u043c\u0430\u0436\u043e\u0440\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use semver::{BuildMetadata, Error, Prerelease, Version};  fn main() -> Result&lt;(), Error> {     let parsed_version = Version::parse(\"0.2.6\")?;      assert_eq!(         parsed_version,         Version {             major: 0,             minor: 2,             patch: 6,             pre: Prerelease::EMPTY,             build: BuildMetadata::EMPTY,         }     );      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.Version.html\">semver::Version<\/a> \u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.Version.html#method.parse\">Version::parse<\/a>. \u0421\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u043e\u043c\u0435\u0440 \u043f\u0440\u0435\u0434\u0440\u0435\u043b\u0438\u0437\u0430 (pre-release) \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0441\u0431\u043e\u0440\u043a\u0435 (build metadata) \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"http:\/\/semver.org\/\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use semver::{BuildMetadata, Error, Prerelease, Version};  fn main() -> Result&lt;(), Error> {     let version_str = \"1.0.49-125+g72ee7853\";     let parsed_version = Version::parse(version_str)?;      assert_eq!(         parsed_version,         Version {             major: 1,             minor: 0,             patch: 49,             pre: Prerelease::new(\"125\").unwrap(),             build: BuildMetadata::new(\"g72ee7853\").unwrap()         }     );      let serialized_version = parsed_version.to_string();     assert_eq!(&amp;serialized_version, version_str);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u0438\u0441\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d<\/strong><\/p>\n<p>  <\/p>\n<p>\u0418\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0441\u0438\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0443\u044e \u0443\u0441\u043b\u043e\u0432\u0438\u044e. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.VersionReq.html\">semver::VersionReq<\/a> \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.VersionReq.html#method.matches\">VersionReq::matches<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use semver::{Error, Version, VersionReq};  fn find_max_matching_version&lt;'a, I>(     version_req_str: &amp;str,     iterable: I, ) -> Result&lt;Option&lt;Version>, Error> where     I: IntoIterator&lt;Item = &amp;'a str>, {     let vreq = VersionReq::parse(version_req_str)?;      Ok(iterable         .into_iter()         .filter_map(|s| Version::parse(s).ok())         .filter(|s| vreq.matches(s))         .max()) }  fn main() -> Result&lt;(), Error> {     assert_eq!(         find_max_matching_version(\"&lt;= 1.0.0\", vec![\"0.9.0\", \"1.0.0\", \"1.0.1\"])?,         Some(Version::parse(\"1.0.0\")?)     );      assert_eq!(         find_max_matching_version(             \">1.2.3-alpha.3\",             vec![                 \"1.2.3-alpha.3\",                 \"1.2.3-alpha.4\",                 \"1.2.3-alpha.10\",                 \"1.2.3-beta.4\",                 \"3.4.5-alpha.9\",             ]         )?,         Some(Version::parse(\"1.2.3-beta.4\")?)     );      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c<\/strong><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>git --version<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Command.html\">Command<\/a>, \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.Version.html\">semver::Version<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.Version.html#method.parse\">Version::parse<\/a>. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.VersionReq.html#method.matches\">Version::matches<\/a> \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/semver\/*\/semver\/struct.VersionReq.html\">semver:VersionReq<\/a> \u0441 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 &#171;git version x.y.z&#187;.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use semver::{Version, VersionReq}; use std::process::Command;  error_chain! {     foreign_links {         Io(std::io::Error);         Utf8(std::string::FromUtf8Error);         SemVer(semver::Error);     } }  fn main() -> Result&lt;()> {     let version_constraint = \">=2.39.2\";     let version_test = VersionReq::parse(version_constraint)?;     let output = Command::new(\"git\").arg(\"--version\").output()?;      if !output.status.success() {         error_chain::bail!(\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u043e\u0439\");     }      let stdout = String::from_utf8(output.stdout)?;     let version = stdout         .split(\" \")         .last()         .ok_or_else(|| \"\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b\")?;     \/\/ \u0412\u0435\u0440\u0441\u0438\u044f Git \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0434 2.39.2.windows.1, \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439     let version = version.split(\".\").take(3).collect::&lt;Vec&lt;_>>().join(\".\");     let parsed_version = Version::parse(&amp;version)?;      if !version_test.matches(&amp;parsed_version) {         error_chain::bail!(             \"\u0412\u0435\u0440\u0441\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0438\u0436\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 {}, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f {})\",             parsed_version,             version_constraint         );     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043a\u043e\u043d\u0435\u0446 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u041a\u043d\u0438\u0433\u0438 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>Happy coding!<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<blockquote><p><a href=\"https:\/\/t.me\/timewebru\"><b>\u041d\u043e\u0432\u043e\u0441\u0442\u0438, \u043e\u0431\u0437\u043e\u0440\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u044b \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Timeweb.Cloud \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c Telegram-\u043a\u0430\u043d\u0430\u043b\u0435<\/b><\/a> <b>\u21a9<\/b><\/p><\/blockquote>\n<p><a href=\"https:\/\/timeweb.cloud\/?i=106909\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\"\/><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/811915\/\"> https:\/\/habr.com\/ru\/articles\/811915\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/fj\/yi\/qn\/fjyiqnduv3l-rdgxnbu_t_qpgxk.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/fj\/yi\/qn\/fjyiqnduv3l-rdgxnbu_t_qpgxk.jpeg\" data-blurred=\"true\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>Hello world!<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/rust-lang-nursery.github.io\/rust-cookbook\/\">\u041a\u043d\u0438\u0433\u0430 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432<\/a> \u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u043e\u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b <code>Rust<\/code>.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/813791\/\">\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a><\/li>\n<li><a href=\"https:\/\/my-js.org\/docs\/guide\/rust-cookbook\">\u041a\u043d\u0438\u0433\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/a><\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-375286","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/375286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=375286"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/375286\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=375286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=375286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=375286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}