{"id":394295,"date":"2024-06-29T11:31:47","date_gmt":"2024-06-29T11:31:47","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=394295"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=394295","title":{"rendered":"<span>\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432 Rust<\/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\">\n<ul>\n<li><strong>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/strong>: <a href=\"https:\/\/habr.com\/ru\/post\/574522\/\">\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440<\/a><\/li>\n<li><strong>\u041d\u0430\u0447\u0430\u043b\u043e \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/strong>: <a href=\"https:\/\/habr.com\/ru\/post\/566668\/\">\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435<\/a><\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h1 id=\"trudnosti-zamykaniya\">\u0422\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f<\/h1>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432 Rust \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=48cafdcfdf8cea78d1966b1e8d6fa1d1\" rel=\"nofollow noopener noreferrer\">\u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    let mut call_count = 0;      let mut sum = | x, y | {         call_count += 1;         x + y     };      dbg!(sum(2, 2));     dbg!(sum(3, 3));     dbg!(sum(4, 4));     dbg!(call_count);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043c\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f Rust. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435 JavaScript? \u041d\u043e \u0432\u0435\u0434\u044c \u0438 \u0442\u0430\u043c: <a href=\"https:\/\/www.albertgao.xyz\/2016\/08\/21\/what-is-a-closure-in-javascript-and-why-they-are-wrong\/\" rel=\"nofollow noopener noreferrer\">What is a closure in JavaScript and why most people have the wrong idea?<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">let fns =[]  for(var i = 0; i &lt; 5; i++) {     var c = i * 2;     fns.push( _ => console.log(c)) }  fns.forEach( f => f() )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0431\u044b, <a href=\"https:\/\/youtu.be\/0K-jXCQWeEI?t=3654\" rel=\"nofollow noopener noreferrer\">\u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442?<\/a>? \u041a\u043e\u0434, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u0440\u0430, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u043d \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0430 &#171;The For Loop little problem&#187;. <\/p>\n<p>  <\/p>\n<p>\u0421\u0445\u043e\u0436\u0438\u0439 \u043f\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/play.golang.org\/p\/UeIyM7pkQbK\" rel=\"nofollow noopener noreferrer\">\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0434\u043b\u044f Go<\/a> (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 <a href=\"https:\/\/stackoverflow.com\/questions\/26692844\/captured-closure-for-loop-variable-in-go\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a>):<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">fns := make([]func(),0)  for i := 0; i &lt; 5; i++ {     f := func(){fmt.Println(i)}     fns = append(fns, f) }  for _, f := range(fns){     f() }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f Rust \u0432\u0441\u0435 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0436\u0438\u0437\u043d\u0438, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c\u044e (mut), \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 <code>move<\/code> \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Box<\/code> \u0434\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u043e, \u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e Rust \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u043b\u043e\u0445\u043e (\u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043e\u0441\u0430\u0434\u043d\u043e \u0438 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e). \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u0440\u0430\u0442\u043a\u0430\u044f \u0438 \u0435\u043c\u043a\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e \u0442\u0435\u043c\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0434\u043e\u043b\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0430\u0441\u044c, \u043d\u043e\u0440\u043e\u0432\u044f \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c (\u0430 \u0442\u043e \u0438 \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0430\u0442\u0435\u0439\u043d\u044b\u043c) \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u043c. <\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u043d\u0430\u0448\u0435\u043b \u043f\u043e\u0434\u0445\u043e\u0434, \u043e\u043d \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u044f\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0435\u0441\u043b\u0438 \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u043c \u043a\u043e\u0434\u0435, \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u044f\u0441\u043d\u0435\u0435. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c.<\/p>\n<p>  <\/p>\n<h1 id=\"bazovye-sluchai-ispolzovaniya-vneshnih-peremennyh-v-zamykaniyah-rust\">\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u0445 Rust<\/h1>\n<p>  <\/p>\n<ul>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f non-Copy \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f Copy-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 Copy \u0438\u043b\u0438 non-Copy<\/li>\n<li>move + \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f Copy-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/li>\n<li>move + \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 Copy \u0438\u043b\u0438 non-Copy<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 (\u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0430\u0434), \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u043d\u0430 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440.<\/p>\n<p>  <\/p>\n<h1 id=\"ispolzovanie-znacheniya-non-copy-peremennoy\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f non-Copy \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/h1>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=fa8d6764fac9be333d6a936120166cd9\" rel=\"nofollow noopener noreferrer\">\u041f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    {         let s = String::from(\"hello\");          let closure = || {             dbg!(s);         };          \/\/ dbg!(s); \/\/ error[E0382]: use of moved value: `s`          closure();         \/\/ closure(); \/\/ error[E0382]: use of moved value: `closure`     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u043e\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0431\u0435\u0437\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u043e &#171;\u043a\u0443\u0448\u0430\u0435\u0442&#187; \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>s<\/code>, \u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0430 \u0441\u0430\u043c\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0430.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <code>Closure {s: String,}<\/code> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 FnOnce:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">trait FnOnce {     fn call_once(self); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0448 <code>FnOnce<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e <a href=\"https:\/\/github.com\/rust-lang\/rust\/blob\/673d0db5e393e9c64897005b470bfeb6d5aec61b\/library\/core\/src\/ops\/function.rs#L219\" rel=\"nofollow noopener noreferrer\">std::ops::FnOnce<\/a>, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait FnOnce&lt;Args> {     ...     extern \"rust-call\" fn call_once(self, args: Args) -> Self::Output;     ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0443\u0442 \u043d\u0430\u0434\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0435\u0441\u0442\u044c &#171;\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0441\u0432\u0430\u0440\u0449\u0438\u043a&#187;, \u044d\u0442\u043e \u043a\u0430\u043a \u0431\u044b intrinsic, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0441\u043e\u0431\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u043e-\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    let closure = Closure{s: s};<\/code><\/pre>\n<p>  <\/p>\n<p>\u042f\u0441\u043d\u043e, \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>s<\/code> \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a <code>Copy<\/code> \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0432 \u043f\u043e\u043b\u0435 <code>Closure.s<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    closure.call_once(1);         \/\/ ClosureFnOnce::call_once(closure, 1);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u043f\u043e \u043d\u0435\u043c\u0443 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>closure<\/code> \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434 <code>call_once()<\/code>, \u0438 <code>closure<\/code> \u0434\u0430\u043b\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u043e\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a, \u0442\u0438\u043f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a <code>impl std::ops::FnOnce() -> ()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn new_closure() -> impl std::ops::FnOnce() -> () {     let s = String::from(\"new_closure\");     || {         dbg!(s);     } }  fn new_equivalent_closure() -> Closure {     let s = String::from(\"new_equivalent_closure\");     Closure{s: s} }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0442\u043e\u0433\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0417\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0435 non-Copy \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043b\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435 \u0442\u0435\u043b\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f<\/li>\n<li>\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 FnOnce \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437<\/li>\n<li>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<h1 id=\"ispolzovanie-znacheniya-copy-peremennoy\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f Copy-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/h1>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=986b3eee9086d7e7c52ad4b2503240cb\" rel=\"nofollow noopener noreferrer\">\u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    \/\/ Capturing a variable whose type implements Copy     {         let mut p = Point{x: 10, y: 20};         {             let closure = || {                 dbg!(p);             };              \/\/ p.x = 11; \/\/ error[E0506]: cannot assign to `p.x` because it is borrowed             dbg!(p);              closure();              closure();         }         p.x = 11;         dbg!(p);     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">#[derive(Copy, Clone, Debug)] struct Point {     x: i32,     y: i32, }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 &#171;\u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u0442&#187; <a href=\"https:\/\/github.com\/rust-lang\/rust\/blob\/673d0db5e393e9c64897005b470bfeb6d5aec61b\/library\/core\/src\/ops\/function.rs#L67\" rel=\"nofollow noopener noreferrer\">Fn<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait Fn&lt;Args>: FnMut&lt;Args> {     ...     extern \"rust-call\" fn call(&amp;self, args: Args) -> Self::Output; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c <code>self<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435, \u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 &#171;\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0430&#187; \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u043f\u0435\u0441\u0442\u0440\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0436\u0438\u0437\u043d\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">struct Closure&lt;'a> {     p: &amp;'a Point, }  impl&lt;'a> Fn for Closure&lt;'a> {     fn call(&amp;self) {         dbg!(*self.p);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 Rust \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn new_equivalent_closure&lt;'a>() -> Closure&lt;'a> {     let p = Point{x: 10, y: 20};     Closure{p: &amp;p} }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error[E0515]: cannot return value referencing local variable `p`<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0445\u0432\u0430\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0444\u043e\u0440\u043c\u0443 <a href=\"https:\/\/github.com\/rust-lang\/rust\/blob\/673d0db5e393e9c64897005b470bfeb6d5aec61b\/library\/core\/src\/ops\/function.rs#L147\" rel=\"nofollow noopener noreferrer\">FnMut<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub trait FnMut&lt;Args>: FnOnce&lt;Args> {     ...     extern \"rust-call\" fn call_mut(&amp;mut self, args: Args) -> Self::Output; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437 <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=d5ce75aa9f1666d69406a9dc5d57b3bb\" rel=\"nofollow noopener noreferrer\">&#171;\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0430&#187;<\/a> \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0432\u0435\u0437\u0434\u0435 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>mut<\/code>, \u043f\u043b\u044e\u0441 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0435 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u043e\u0433\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0417\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 Copy-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f<\/li>\n<li>\u0417\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c Copy-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f<\/li>\n<li>\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f Fn\/FnMut \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437<\/li>\n<li>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 Fn\/FnMut \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/li>\n<\/ul>\n<p>  <\/p>\n<h1 id=\"ispolzovanie-ssylki-na-copy-ili-non-copy\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 Copy \u0438\u043b\u0438 non-Copy<\/h1>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Copy-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e, \u043c\u0435\u0436\u0434\u0443 Copy \u0438 non-Copy \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<h1 id=\"move--ispolzovanie-znacheniya-copy-peremennoy\">move + \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f Copy-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e Copy-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043f\u043e\u0442\u043e\u043a, \u0442\u043e \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0434\u0435\u0442 <code>move<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    let mut p = Point{x: 10, y: 20};     {         let mut closure = move || {             p.y += 1;             dbg!(p);         };     }<\/code><\/pre>\n<p>  <\/p>\n<p>&#171;\u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442&#187; \u0442\u0435\u043f\u0435\u0440\u044c <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=71e7df482bdff666a692012b0273b92f\" rel=\"nofollow noopener noreferrer\">\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">struct Closure {     p: Point, }  impl FnMut for Closure {     fn call(&amp;mut self) {         self.p.x += 1;         dbg!(self.p);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a, \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn new_closure() -> impl std::ops::FnMut() -> () {     let mut p = Point{x: 300, y: 400};     move || {         p.y += 1;         dbg!(p);     } }  fn new_equivalent_closure() -> Closure {     let p = Point{x: 500, y: 660};     Closure{p: p} }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 &#171;\u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u043e\u0439&#187; \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    \/\/ move + capturing a variable whose type implements Copy     {         let mut p = Point{x: 10, y: 20};         let mut closure = move || {             p.x += 1;             dbg!(p);         };          dbg!(p); \/\/ 10, 20          closure();  \/\/ 11, 20         closure();  \/\/ 12, 20          dbg!(p); \/\/ 10, 20     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441 \u2014 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438 <code>p<\/code>, \u0445\u043e\u0442\u044f \u043e\u043d\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043b\u0438\u0446\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u044c \u0432 \u044f\u0437\u044b\u043a\u0435 \u2014 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u043f\u0438\u0438 \u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u0424\u0443 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c. \u0412 &#171;\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435&#187; \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 <code>mut p<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    \/\/ Equivalent     {         let p = Point{x: 100, y: 200};         let mut closure = Closure{p: p};          dbg!(p);          closure.call();          closure.call();          dbg!(p);     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0442\u043e\u0433\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>move<\/code> \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u043c \u0438 &#171;\u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u043e\u0439&#187; \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e<\/li>\n<li>\u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 Fn\/FnMut, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a<\/li>\n<li>\u0412\u043d\u0443\u0442\u0440\u0438 <code>move<\/code>-\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c non-Copy \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043a\u0441\u0442\u0430\u0442\u0438 (PS: \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c\u043e\u043c\u0443 \u043d\u0438\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e, \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435), \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043d\u0435\u0439 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u0435 \u0442\u0435\u043b\u0430 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<blockquote><p>\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 (\u0430\u043d\u0433\u043b. closure) \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0432 \u0442\u0435\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u0435 \u0442\u0435\u043b\u0430 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0435\u0451 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u0413\u043e\u0432\u043e\u0440\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\" rel=\"nofollow noopener noreferrer\">\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435)<\/a><\/p><\/blockquote>\n<p>  <\/p>\n<h1 id=\"move--ispolzovanie-ssylki-na-copy-ili-non-copy\">move + \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 Copy \u0438\u043b\u0438 non-Copy<\/h1>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u044d\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u0438 \u043b\u0435\u0433\u043a\u043e <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=e0a910b3e11ced4a7050acfc29eff94f\" rel=\"nofollow noopener noreferrer\">&#171;\u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0431\u043b\u0438&#187;<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn move_by_x(p: &amp;mut Point, delta: i32) {     p.x += delta; }  fn main() {     let mut p = Point{x: 10, y: 20};     let mut closure = move || {         move_by_x(&amp;mut p, 1);         dbg!(&amp;p);     };     ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422.\u0435. \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 <code>move_by_x()<\/code> \u0441\u0441\u044b\u043b\u043a\u0443, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <strong>\u0442\u0440\u0435\u0431\u0443\u0435\u0442<\/strong> \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438 <code>p<\/code> (<code>mut p<\/code>), \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0438\u0432\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e <code>move_by_x()<\/code> \u0438\u0437\u043c\u0435\u043d\u0438\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, <a href=\"https:\/\/youtu.be\/SWKHUA9EGcU?t=2382\" rel=\"nofollow noopener noreferrer\">\u043d\u043e \u043d\u0435\u0442?<\/a>. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u043c (receiver) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>&amp;self<\/code>. <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=1d37c477a68c36bdd16185579223c190\" rel=\"nofollow noopener noreferrer\">\u041f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">impl Point {     fn move_by_x(&amp;mut self, delta: i32) {         self.x += delta;     } }  fn main() {     let mut p = Point{x: 10, y: 20};     let mut closure = move || {         p.move_by_x(1);         dbg!(&amp;p);     };     ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0435 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f &#171;move + \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&#187;, \u0442.\u0435. \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f Fn\/FnMut, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0442\u043e\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441 \u0442\u0430\u043a\u0438 \u0435\u0441\u0442\u044c. \u041e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a non-Copy \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 move <a href=\"https:\/\/play.rust-lang.org\/?version=nightly&amp;mode=debug&amp;edition=2021&amp;gist=0c4b1392581debfe0d585af7bdec8016\" rel=\"nofollow noopener noreferrer\">\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/a> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 (\u0438\u043b\u0438 &#171;\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0432 \u043f\u043e\u0442\u043e\u043a\u0438&#187;) Fn\/FnMut:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn new_closure() -> impl FnMut(){     let mut s = String::from(\"Back\");     move || {         s.push_str(\" in the\");         s.push_str(\" U.S.S.R\");         dbg!(&amp;s);     }     }  fn main() {        let mut closure = new_closure();      closure();     closure();     closure(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0431\u0435\u0437 move <a href=\"https:\/\/play.rust-lang.org\/?version=nightly&amp;mode=debug&amp;edition=2021&amp;gist=97db98765b2ef75e3c7607aa4f89f745\" rel=\"nofollow noopener noreferrer\">\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c<\/a> \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 FnOnce:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn new_closure() -> impl FnOnce(){     let mut s = String::from(\"Back\");     || {         s.push_str(\" in the\");         s.push_str(\" U.S.S.R\");         dbg!(s);     }     }  fn main() {     let closure = new_closure();      closure();     \/\/ closure(); \/\/ error[E0382]: use of moved value: `closure` }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c &#171;\u0432\u043e\u0437\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0441\u0442\u044c&#187; \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e (dbg!(s)), \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0432 FnOnce.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h1 id=\"peredacha-zamykaniy-v-funkcii-pri-pomoschi-parametrov-tipa\">\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0438\u043f\u0430<\/h1>\n<p>  <\/p>\n<p>\u0412 Rust \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u043c, \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0442\u0430\u043a\u043e\u0432\u0430: <code>Fn<\/code> -> <code>FnMut<\/code> -> <code>FnOnce<\/code>. \u0422.\u0435. \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <code>FnOnce<\/code>, \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0430\u0442\u044c <code>Fn<\/code> \u0438\u043b\u0438 <code>FnMut<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    let mut call_count = 0;      let sum = |x, y| {         call_count += 1;         x + y     };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0430\u0436\u043d\u043e \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0438\u043f\u0430.<\/p>\n<p>  <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u043a\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn call_sum_way1&lt;F: FnMut(i32, i32) -> i32>(mut sum: F) {<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0430\u0441\u0442\u0444\u0443\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn call_sum_way2(mut sum: impl FnMut(i32, i32) -> i32) {<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0442\u0438\u043b\u044c\u043d\u043e, \u043c\u043e\u0434\u043d\u043e, \u043c\u043e\u043b\u043e\u0434\u0435\u0436\u043d\u043e, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn call_sum_way3&lt;F>(mut sum: F) where     EXISTS (SELECT FROM Items WITH (NOLOCK) WHERE Name = F.Name AND Type = \"FnMut\" AND ParamsCount = 2  AND ResultsCount = 1)      AND EXISTS (SELECT FROM Params WHERE FuncName = F.Name AND Idx = 0 and Type = \"i32\")      AND EXISTS (SELECT FROM Params WHERE FuncName = F.Name AND Idx = 1 and Type = \"i32\")          AND EXISTS (SELECT FROM Results WHERE FuncName = F.Name AND Idx = 0 and Type = \"i32\")      <\/code><\/pre>\n<p>  <\/p>\n<p>\u0428\u0443\u0442\u043a\u0430, \u0432\u043e\u0442 \u0442\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn call_sum_way3&lt;F>(mut sum: F) where     F: FnMut(i32, i32) -> i32,<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=e3969b81eb76b17a14bd651d0ac328e0\" rel=\"nofollow noopener noreferrer\">\u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435<\/a>. <\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0438\u043f\u0430 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0442.\u043d. &#171;\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c&#187;, \u0442.\u0435. \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0438\u043f\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u043d\u043e\u043c\u043e\u0440\u0444\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=1e4fb9f0f29df75c54068e12828ca254\" rel=\"nofollow noopener noreferrer\">\u041f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     let sum = |x, y| {         x + y     };     call_sum(sum);      let sum = |x, y| {         x + y + 20     };     call_sum(sum); }  fn call_sum&lt;F: FnMut(i32, i32) -> i32>(mut sum: F) {     sum(2, 2);     sum(3, 3);     sum(4, 4); }   <\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u043e\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u044f\u0432\u043d\u044b\u0439 \u0442\u0438\u043f, \u0442\u0430\u043a \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>call_sum()<\/code> \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b. \u0427\u0442\u043e\u0431\u044b \u0432 \u044d\u0442\u043e\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044f\u0442\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440, \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0432 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 <code>Symbol Demangling<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">_ZN10playground8call_sum17h27c8971da28680efE:     sub rsp, 56     mov dword ptr [rsp + 16], 2     mov dword ptr [rsp + 20], 2     mov esi, dword ptr [rsp + 16]     mov edx, dword ptr [rsp + 20]     lea rdi, [rsp + 8]     call    _ZN10playground4main28_$u7b$$u7b$closure$u7d$$u7d$17h1ec7382e3c1e9c39E     jmp .LBB17_1     ... _ZN10playground8call_sum17h6c6a460f1c9cf47aE:     sub rsp, 56     mov dword ptr [rsp + 16], 2     mov dword ptr [rsp + 20], 2     mov esi, dword ptr [rsp + 16]     mov edx, dword ptr [rsp + 20]     lea rdi, [rsp + 8]     call    _ZN10playground4main28_$u7b$$u7b$closure$u7d$$u7d$17h9220f028b950d2f4E     jmp .LBB18_1     ...    <\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"peredacha-zamykaniy-pri-pomoschi-umnyh-ukazateley\">\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0443\u043c\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439<\/h1>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 (&#171;\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c&#187; \u0438\u043b\u0438 &#171;\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u0432&#187;), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 &#171;\u043a\u0443\u0447\u0443&#187;:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     let sum = |x, y| {         x + y     };     call_sum(Box::new(sum));      let sum = |x, y| {         x + y + 20     };     call_sum(Box::new(sum)); }  fn call_sum(mut sum: Box&lt;dyn FnMut(i32, i32) -> i32>) {     sum(2, 2);     sum(3, 3);     sum(4, 4); }<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u0443\u0447\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>Box::new(sum)<\/code><\/li>\n<li>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043a\u0443\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f<\/li>\n<li>\u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>dyn<\/code> (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0435 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c)<\/li>\n<li><code>call_sum()<\/code> \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u044f\u0449\u043d\u044b\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">type MyClosure = dyn FnMut(i32, i32) -> i32;  fn call_sum(mut sum: Box&lt;MyClosure>) {     sum(2, 2);     sum(3, 3);     sum(4, 4); }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"vozvrat-zamykaniy-iz-funkciy\">\u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h1>\n<p>  <\/p>\n<p>\u0418\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     dbg!(get_sum(1)(10, 20));     dbg!(get_sum(2)(10, 20)); }  fn get_sum(mult: i32) -> impl FnMut(i32, i32) -> i32 {     return move |x, y| {         mult * (x + y)     }; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u0435\u0437 <code>move<\/code> \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u0432\u0435\u0440\u043d\u0435\u043c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>mult<\/code>. \u0422\u0430\u043a \u0434\u0435\u043b\u043e \u043d\u0435 \u043f\u043e\u0439\u0434\u0435\u0442, \u043e\u043f\u0430\u0441\u043d\u043e, \u043d\u0443\u0436\u043d\u043e &#171;\u0437\u0430\u043c\u0435\u0441\u0442\u0438&#187; \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 <code>move<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0434\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn get_sum2(mult: i32, minus: bool) -> impl FnMut(i32, i32) -> i32 {     if minus {         return move |x, y| {             mult * (x + y)         };     } else {         return move |x, y| {             mult * (x - y)         };             } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0448\u0438\u043a\u0430\u0440\u043d\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  = note: to return `impl Trait`, all returned values must be of the same type   = note: no two closures, even if identical, have the same type   = help: consider boxing your closure and\/or using it as a trait object<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 <code>impl<\/code> \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">trait Summer {     fn get_sum(mult: i32) -> impl FnMut(i32, i32) -> i32; }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error[E0562]: `impl Trait` not allowed outside of function and method return types  --> src\/lib.rs:2:30   | 2 |     fn get_sum(mult: i32) -> impl FnMut(i32, i32) -> i32;   |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443? \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043e\u0442 <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=13012a65877b2bbda1331802900c0fb7\" rel=\"nofollow noopener noreferrer\">\u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn call_closure() {     get_closure()(); }  fn call_closure2() {     get_closure2()(); }  fn get_closure() -> impl Fn() {     let array: [i32; 50] = [0; 50];     return move || {         dbg!(array);     }; }  fn get_closure2() -> impl Fn() {     let array: [i32; 100] = [0; 100];     return move || {         dbg!(array);     }; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0434\u0432\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u0412\u043a\u043b\u044e\u0447\u0438\u043c \u0434\u043b\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 <code>Symbol Demangling<\/code> \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">playground::call_closure:     sub rsp, 200     mov rdi, rsp     call    playground::get_closure     mov rdi, rsp     call    playground::get_closure::{{closure}}     add rsp, 200     ret  playground::call_closure2:     sub rsp, 408     lea rdi, [rsp + 8]     call    playground::get_closure2     lea rdi, [rsp + 8]     call    playground::get_closure2::{{closure}}     add rsp, 408     ret<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u043d \u043e\u043d\u043e \u0447\u0442\u043e, \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043a \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e (<code>sub rsp, ...<\/code>). \u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c &#171;\u0443\u0432\u0438\u0434\u0435\u0442\u044c&#187; \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, &#171;\u0432\u043d\u0443\u0442\u0440\u044c&#187; \u043d\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u0432 \u043a\u0443\u0447\u0443, \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">trait Summer {     fn get_sum(mult: i32) -> Box&lt;dyn FnMut(i32, i32) -> i32>; }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"peredacha-zamykaniy-v-potoki\">\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0432 \u043f\u043e\u0442\u043e\u043a\u0438<\/h1>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=81589445fc47b7c6662eee8e03ee978e\" rel=\"nofollow noopener noreferrer\">\u041f\u0440\u0438\u043c\u0435\u0440<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::thread;  fn main() {     let s = String::from(\"Hello\");      let handle = thread::spawn(|| {         dbg!(s);     });      handle.join().unwrap(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u0438\u043c FnOnce, <code>thread::spawn()<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f, \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (<code>unwrap()<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f, \u043d\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435).<\/p>\n<p>  <\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 &#171;\u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438&#187; \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0432 \u043f\u043e\u0442\u043e\u043a\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0432 \u043d\u0438\u0445 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 <a href=\"https:\/\/doc.rust-lang.org\/std\/thread\/fn.spawn.html\" rel=\"nofollow noopener noreferrer\">thread::spawn<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">pub fn spawn&lt;F, T>(f: F) -> JoinHandle&lt;T>  where     F: FnOnce() -> T,     F: Send + 'static,     T: Send + 'static, <\/code><\/pre>\n<p>  <\/p>\n<p><code>F: Send + 'static<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043c\u0435\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 (<code>Send<\/code>), \u0438 \u0432\u0441\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c) \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <code>static<\/code>, \u0442.\u0435. \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c <code>Send<\/code> \u0438 <code>'static<\/code> \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.<\/p>\n<p>  <\/p>\n<h1 id=\"peredacha-zamykaniy-v-potokisend\">\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0432 \u043f\u043e\u0442\u043e\u043a\u0438::Send<\/h1>\n<p>  <\/p>\n<p><code>Send<\/code> \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u0440\u043a\u0435\u0440\u043d\u044b\u0439 <del>\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/del> \u0442\u0438\u043f\u0430\u0436, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u041a\u043d\u0438\u0433\u0435:<\/p>\n<p>  <\/p>\n<blockquote><p>\u041f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f Rust \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u043c Send, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0432\u0440\u043e\u0434\u0435 <code>Rc<\/code>: \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c Send, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>Rc<\/code> \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043a\u043b\u043e\u043d\u043e\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a, \u043e\u0431\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. <\/p>\n<p>  <a href=\"https:\/\/doc.rust-lang.ru\/book\/ch16-04-extensible-concurrency-sync-and-send.html#%D0%A0%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B8-%D0%B2%D0%BE-%D0%B2%D0%BB%D0%B0%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-send\" rel=\"nofollow noopener noreferrer\">\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u043e \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Send<\/a><\/p><\/blockquote>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c. \u0412\u043e\u0437\u044c\u043c\u0435\u043c <code>Box<\/code>, \u0435\u0433\u043e \u0446\u0435\u043b\u044c \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u0443\u0447\u0435. <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=88bb17b686c3b9c7786614f29770c922\" rel=\"nofollow noopener noreferrer\">\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    let p = Box::new(Point { x: 10, y: 20 });      let handle = thread::spawn(|| {         dbg!(p);     });     handle.join().unwrap(); <\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u0443\u0447\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432 \u043f\u043e\u0442\u043e\u043a. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>Rc<\/code>. \u0415\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u0443\u0447\u0435 \u0438 \u0432\u0435\u0441\u0442\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043d\u0435\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u0432\u044b\u0439\u0434\u0443\u0442 \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    let p1 = Rc::new(Point { x: 10, y: 20 });     let p2 = p1.clone();     let p3 = p1.clone();     dbg!(p1);     dbg!(p2);     dbg!(p3);<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li>p1, p2 \u0438 p3 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u0443\u0447\u0435<\/li>\n<li>p1, p2 \u0438 p3 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/li>\n<li>\u041c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430 p1, p2 \u0438 p3 \u043d\u0435\u043b\u044c\u0437\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p><code>Rc<\/code> \u0431\u044b\u0441\u0442\u0440, \u043d\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u043e\u043f\u0430\u0441\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=9279706db7279b64f62a6a4060e8c0de\" rel=\"nofollow noopener noreferrer\"><code>\u043b\u0438\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0435\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u043a\u0430 Send<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    let p = Rc::new(Point { x: 10, y: 20 });      let handle = thread::spawn(|| {         dbg!(p);     });      handle.join().unwrap();<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error[E0277]: `Rc&lt;Point>` cannot be sent between threads safely    --> src\/main.rs:13:18     | 13  |       let handle = thread::spawn(|| {     |  __________________^^^^^^^^^^^^^_-     | |                  |     | |                  `Rc&lt;Point>` cannot be sent between threads safely<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"peredacha-zamykaniy-v-potokistatic\">\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u0432 \u043f\u043e\u0442\u043e\u043a\u0438::&#8217;static<\/h1>\n<p>  <\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a\u0438, \u0434\u043e\u043b\u0436\u043d\u044b \u0436\u0438\u0442\u044c \u0434\u043e\u043b\u0433\u043e, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u0442\u043e\u043a \u2014 \u0442.\u0435. \u0442\u043e \u0441\u0430\u043c\u043e\u0435 <code>'static<\/code>. \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::thread;  fn main() {     let x = 10;      let handle = thread::spawn(|| {         dbg!(x);     });      handle.join().unwrap(); }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">6 |     let handle = thread::spawn(|| {   |                                ^^ may outlive borrowed value `x` 7 |         dbg!(x);   |              - `x` is borrowed here   | note: function requires argument type to outlive `'static`<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0443\u0442-\u0442\u043e \u0438 <a href=\"https:\/\/play.rust-lang.org\/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=9981dedc5b9f0fdd513203f86dfaeddd\" rel=\"nofollow noopener noreferrer\"><code>\u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f move ||<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::thread;  fn main() {     let x = 10;      let handle = thread::spawn(move || {         dbg!(x);     });      handle.join().unwrap(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0435 \u0441\u0441\u044b\u043b\u043a\u0430, \u0430 \u043a\u043e\u043f\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 <code>'static<\/code> \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u2014 \u0441\u0441\u044b\u043b\u043e\u043a-\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442. \u0412\u0440\u043e\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a \u2014 \u043c\u043e\u0436\u043d\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::thread;  fn main() {     let s = String::from(\"hello\");      let handle = thread::spawn(|| {         dbg!(s);     });      handle.join().unwrap(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>String<\/code> \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <del>\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/del> <code>Copy<\/code>, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>dbg!(s)<\/code> &#171;\u0441\u044a\u0435\u0434\u0430\u0435\u0442&#187; \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>s<\/code> \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0435\u0442 \u043d\u0443\u0436\u0434\u044b \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u2014 \u0432\u043d\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c <code>s<\/code>, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 <code>x<\/code>, \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>move<\/code> \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u043e, \u0435\u0441\u043b\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a (\u0438\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438) \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <strong>\u0443\u043c\u0435\u0435\u0442<\/strong> \u0432 <code>Copy<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a, \u043f\u043e\u0440\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<h1 id=\"nekotorye-razmyshleniya\">\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f<\/h1>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u044f \u0431\u044b \u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043f\u0443\u0442\u0435\u043c \u0438\u0445 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 &#171;\u0437\u0430\u0445\u0432\u0430\u0442\u0430&#187; \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u044f\u0432\u043d\u043e, \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u044b \u043d\u0435\u043b\u044c\u0437\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">    let x = 10;      \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043f\u0438\u044e x     let captureByValue = {closurex: x} || {         dbg!(closurex)         \/\/ dbg!(x) \/\/ error[E0425]: cannot find value `x` in this scope     });      \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0443\u044e \u043a\u043e\u043f\u0438\u044e x     let mutCaptureByValue = {mut closurex: x} || {         \/\/ \u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e         closurex = 20;     });          \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 x     let captureByReference = {closurex: &amp;x} || {         ...         \/\/ \u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435         *closurex += 1;     });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0432\u0441\u0435, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u0431\u0440\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 &#171;\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0435&#187; \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 \u043c\u0438\u0433\u043e\u043c \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u0431\u044b \u0432\u0441\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u043d\u0435\u0435:<\/p>\n<p>  <\/p>\n<blockquote><p>&#171;\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 (\u0430\u043d\u0433\u043b. closure) \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0432 \u0442\u0435\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u0435 \u0442\u0435\u043b\u0430 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0435\u0451 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438&#187;<\/p><\/blockquote>\n<p>\u0422\u0443\u0442 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e, \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044f\u043c\u0438, \u043a\u043e\u0440\u043d\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0445\u043e\u0434\u044f\u0442 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0435 \u0442\u044b\u0441\u044f\u0447\u0435\u043b\u0435\u0442\u0438\u0435. \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e &#171;\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f&#187; \u0432 Rust, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c <code>move<\/code>, \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f &#171;\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u043c\u0438&#187; \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u0441\u043c\u044b\u0441\u043b\u0435, \u0442\u0430\u043a \u0443 \u043d\u0438\u0445 \u0432 \u0442\u0435\u043b\u0435 \u043d\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=djxWE1wxaQg&amp;t=2321s\" rel=\"nofollow noopener noreferrer\">\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435?<\/a> \u043f\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u043c.<\/p>\n<p>  <\/p>\n<p><strong>\u0414\u0430\u043b\u0435\u0435<\/strong>: <a href=\"https:\/\/habr.com\/ru\/post\/646105\">\u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430 Rust \u0432 \u0441\u0442\u0438\u043b\u0435 \u0421\/C++<\/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\/588917\/\"> https:\/\/habr.com\/ru\/articles\/588917\/<\/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\">\n<ul>\n<li><strong>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/strong>: <a href=\"https:\/\/habr.com\/ru\/post\/574522\/\">\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440<\/a><\/li>\n<li><strong>\u041d\u0430\u0447\u0430\u043b\u043e \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/strong>: <a href=\"https:\/\/habr.com\/ru\/post\/566668\/\">\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435<\/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-394295","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/394295","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=394295"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/394295\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=394295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=394295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=394295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}