{"id":270687,"date":"2015-12-18T18:46:02","date_gmt":"2015-12-18T15:46:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=270687"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=270687","title":{"rendered":"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c swift \u0438 rust"},"content":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/01e\/b90\/7e1\/01eb907e1a0345b096f1aab0e7070ca6.png\" align=\"left\"\/><br \/>  \u041f\u043e\u0432\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0442\u0430\u043b\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u044f\u0437\u044b\u043a\u0430 swift \u2014 \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0431\u043b\u0438\u0436\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u043d\u0438\u043c. \u0412 \u0433\u043b\u0430\u0437\u0430 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0431\u0440\u043e\u0441\u0438\u043b\u0430\u0441\u044c \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u043b\u043e\u0434\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c rust, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0437\u0430 \u0441\u0445\u043e\u0436\u0438\u043c\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u0438 \u0441\u0445\u043e\u0436\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u041e\u0431\u0430 \u044f\u0437\u044b\u043a\u0430 \u0438\u043c\u0435\u044e\u0442 \u0441\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0442\u0438\u043f\u043e\u0432, \u043e\u0431\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0418 \u0442\u043e\u0442 \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a\u0438 \u0432\u043f\u0438\u0442\u0430\u043b\u0438 \u0432 \u0441\u0435\u0431\u044f \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u0438\u0437 \u043c\u0438\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0418 swift \u0438 rust \u0438\u043c\u0435\u044e\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 C, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437 \u0442\u0440\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041e\u0431\u0430 \u044f\u0437\u044b\u043a\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0437\u0430\u043c\u0435\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u0430\u043c \u0442\u0438\u043f\u0430 C, C++, ObjectiveC. \u0422\u0430\u043a \u0447\u0442\u043e \u0436\u0435 \u0432 \u043d\u0438\u0445 \u043e\u0431\u0449\u0435\u0433\u043e, \u0430 \u0447\u0442\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f?<br \/>  <a name=\"habracut\"><\/a><\/p>\n<h4>\u041e\u0441\u043d\u043e\u0432\u044b \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430<\/h4>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u044f \u043d\u0435 \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u043e\u0441\u043d\u043e\u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0443\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u044f\u0441\u043d\u043e, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a <a href=\"https:\/\/www.gitbook.com\/book\/kgv\/rust_book_ru\/details\">rustbook<\/a> \u0438\u043b\u0438 <a href=\"http:\/\/swiftbook.ru\/\">swiftbook<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <b>rust<\/b>  <\/p>\n<pre><code class=\"rust\">fn main() {     let i:int32 = 16;     let mut f = 8.0;     f *= 2.0;      println!(&quot;Hello rust! within vars {} and {}&quot;, i, f); } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>let i:Int = 10 var f = 15.0 f \/= 2  print(&quot;Hello swift within vars \\(i) \\(f)&quot;) <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e let \u0438 \u0442\u0430\u043c \u0438 \u0442\u0430\u043c \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435, \u0430 swift var \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d rust let mut. \u041d\u043e \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f: \u0432 rust \u0432\u043e \u0432\u0441\u0435\u0445 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u0430\u0445 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440, \u0430 swift \u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044f\u043c \u0421\u0438. \u0412 \u044d\u0442\u043e\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0435 rust \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c. <br \/>  \u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 rust&#8217;\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 format!, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0434\u0440\u0430\u0445 println!, \u0430 \u0432 swift&#8217;\u0435 \u0436\u0435 \u044d\u0442\u043e \u0444\u0438\u0447\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0437\u0430\u0434\u0430\u0442\u044c \u043e\u043f\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. <br \/>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u043d\u0438\u0438 &quot;;&quot;: \u0434\u043b\u044f rust&#8217;\u0430 \u044d\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u044f\u0449\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. Swift \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044f\u043c pascal&#8217;\u044f, \u0433\u0434\u0435 \u0442\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0442 \u0434\u0432\u0443\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e:<\/p>\n<p>  <b>rust<\/b>  <\/p>\n<pre><code class=\"rust\">fn apply&lt;F: 'static&gt;(f: F, v1: i32) -&gt; Box&lt;Fn(i32) -&gt; ()&gt;     where F: Fn(i32, i32) -&gt; () {     Box::new(move |v2| f(v1, v2)) }  fn print_sum(a: i32, b: i32) -&gt; () {     println!(&quot;Rust: sum a and b is {}&quot;, a + b); }  fn main() {     let a = 2; let b = 5;     print_sum(a, b);      let f = print_sum;     let f2 = apply(f, b);     f2(a); } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>func apply(f: (_: Int, _: Int) -&gt; (), _ v1: Int) -&gt; (_: Int) -&gt; () {     return {(c: Int) -&gt; () in         return f(v1, c)     } }  func print_sum(a: Int, second b: Int) -&gt; () {     print(&quot;Swift: sum a and b is \\(a+b)&quot;) }  let a = 2; let b = 5; print_sum(a, second:b)  let f2 = apply(print_sum, b) f2(a) <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u044f\u0432\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f, \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0437\u0430 \u0431\u043e\u0440\u0442\u043e\u043c \u0447\u0438\u0441\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0442\u0438\u043f\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u043c\u0435\u043d \u0443 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 swift \u0438\u043b\u0438 \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 rust, \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0443 \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u0431\u043e\u043b\u0435\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b. \u041f\u043e\u0434\u0445\u043e\u0434 swift \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439: \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0448\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0434\u043b\u044f rust \u0436\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0435\u0451 \u044f\u0432\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432 box, \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e moved \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437\u0440\u0430\u0437\u043c\u0435\u0440\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c. <br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u044c\u0438 \u0436\u0435 \u043b\u044f\u043c\u0431\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\"><b>rust<\/b>  <\/p>\n<pre><code class=\"rust\">fn apply&lt;F: 'static&gt;(f: F, v1: i32) -&gt; Box&lt;Fn(i32) -&gt; i32&gt;     where F: Fn(i32, i32) -&gt; i32 {     Box::new(move |v2| f(v1, v2)) }  fn make_sum(a: i32, b: i32) -&gt; i32 {     a + b }  fn main() {     let a = 2; let b = 5;     let c = make_sum(a, b);     println!(&quot;Rust: c is {}&quot;, c);      let f2 = apply(make_sum, b);      let mut d = 0;     for i in 0..1000000000 {         d = f2(i);     }      println!(&quot;Rust: d is {}&quot;, d); }  <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>func apply(f: (_: Int, _: Int) -&gt; Int, _ v1: Int) -&gt; (_: Int) -&gt; Int {     return {(c: Int) -&gt; Int in         return f(v1, c)     } }  func make_sum(a: Int, second b: Int) -&gt; Int {     return a + b }  let a = 2; let b = 5; let c = make_sum(a, second:b) print(&quot;Swift: c is \\(c)&quot;)  let f2 = apply(make_sum, b) f2(a)  var d = 0; for i in 0...1000000000 {     d = f2(i); }  print(&quot;Swift: d is \\(d)&quot;); <\/code><\/pre>\n<\/p><\/div>\n<\/div>\n<p>  \u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: 4.0 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0443 rust \u043f\u0440\u043e\u0442\u0438\u0432 1.17 \u0443 swift. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u043e\u043b\u0435\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 ruRust\/general \u043c\u043d\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043d\u043e \u0437\u0430\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0443 \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u043b\u043d\u043e\u0439. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 Rust \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b \u0432\u0435\u0441\u044c \u0446\u0438\u043a\u043b \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e. <br \/>  \u0412 \u0443\u043c\u0435\u043b\u044b\u0445 \u0440\u0443\u043a\u0430\u0445 rust \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u0432\u043e\u0440\u0438\u0442\u044c \u0447\u0443\u0434\u0435\u0441\u0430.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"rust\">struct Curry&lt;'a&gt; {     f: &'a Fn(i32, i32) -&gt; i32,     v1: i32 }  impl&lt;'a&gt; Curry&lt;'a&gt; {     fn new&lt;F: 'static&gt;(f: &'a F, v1: i32) -&gt; Curry&lt;'a&gt; where F: Fn(i32, i32) -&gt; i32  {         Curry { f: f, v1: v1 }     }      fn call(&'a self, v2: i32) -&gt; i32 {         (*self.f)(self.v1, v2)     } }  fn make_sum(a: i32, b: i32) -&gt; i32 {     a + b }  fn main() {     let a = 2; let b = 5;     let c = make_sum(a, b);     println!(&quot;Rust: c is {}&quot;, c);      let borrow = &make_sum;     let f2 = Curry::new(borrow, b);      let mut d = 0;     for i in 0..1000000000 {         d = f2.call(i);     }      println!(&quot;Rust: d is {}&quot;, d); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<h4>\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c:<\/h4>\n<p>  \u041e\u0431\u0430 \u044f\u0437\u044b\u043a\u0430 \u0438\u043c\u0435\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c, \u0432 \u043e\u0431\u043e\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438: \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.<\/p>\n<p>  <b>rust<\/b>  <\/p>\n<pre><code class=\"rust\">enum MathOperation {     Value(i32),     Sum(Box&lt;MathOperation&gt;, Box&lt;MathOperation&gt;),     Mul(Box&lt;MathOperation&gt;, Box&lt;MathOperation&gt;) }  trait HasName {     fn name(&self) -&gt; &'static str; }  impl HasName for MathOperation {     fn name(&self) -&gt; &'static str {         match *self {             MathOperation::Value(_) =&gt; &quot;Value&quot;,             MathOperation::Sum(_,_) =&gt; &quot;Sum&quot;,             MathOperation::Mul(_,_) =&gt; &quot;Mul&quot;         }     } }  impl MathOperation {     fn solve(&self) -&gt; i32 {         match *self {             MathOperation::Value(i)         =&gt; i,             MathOperation::Sum(ref left, ref right) =&gt; left.solve() + right.solve(),             MathOperation::Mul(ref left, ref right) =&gt; left.solve() * right.solve()         }     } }  fn main() {     let op = MathOperation::Sum(Box::new(MathOperation::Value(10)),                                 Box::new(MathOperation::Mul(Box::new(MathOperation::Value(20)),                                                             Box::new(MathOperation::Value(2)))));                                      ;     println!(&quot;Rust: op is {} solved {}&quot;, op.name(), op.solve()); }  <\/code><\/pre>\n<p>  <b>Swift<\/b>  <\/p>\n<pre><code>enum MathOperation {   case Value(Int)   indirect case Sum(MathOperation, MathOperation)   indirect case Mul(MathOperation, MathOperation)      func solve() -&gt; Int {     switch self {     case .Value(let value):         return value     case .Sum(let left, let right):         return left.solve() + right.solve()     case .Mul(let left, let right):         return left.solve() * right.solve()     }   } }  protocol HasName {   func name() -&gt; String; }  extension MathOperation : HasName {   func name() -&gt; String {     switch self {       case .Value(_):         return &quot;Value&quot;       case .Sum(_, _):         return &quot;Sum&quot;       case .Mul(_, _):         return &quot;Mul&quot;       }   } }  let op = MathOperation.Sum(MathOperation.Value(10),                            MathOperation.Mul(MathOperation.Value(20),                                              MathOperation.Value(2)))                                               print(&quot;Swift: op is \\(op.name()) solved \\(op.solve())&quot;);  <\/code><\/pre>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 Rust \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Box, \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0438 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0437\u043d\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 swift \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0432\u043e indirect, \u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0435\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0440\u0430\u0437\u0432\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u043d\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c? \u041f\u043e-\u0432\u0438\u0434\u0438\u043c\u043e\u043c\u0443 \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430. <br \/>  \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e impl \u0438 extension \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0430 \u0442\u0438\u043f\u0430\u0436\u0438 \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b. \u041d\u043e \u0432 swift \u043f\u043e\u0434\u0445\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u043d\u044b\u0439: \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0430\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c:<\/p>\n<p>  <b>rust<\/b> (\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0437\u044f\u0442\u044b \u0438\u0437 rust by example)<\/p>\n<pre><code class=\"rust\">match some_value {     Ok(value) =&gt; println!(&quot;got a value: {}&quot;, value),     Err(_) =&gt; println!(&quot;an error occurred&quot;), }  enum OptionalTuple {     Value(i32, i32, i32),     Missing, }  let x = OptionalTuple::Value(5, -2, 3);  match x {     OptionalTuple::Value(..) =&gt; println!(&quot;Got a tuple!&quot;),     OptionalTuple::Missing =&gt; println!(&quot;No such luck.&quot;), }  let x = 1;  match x {     1 ... 5 =&gt; println!(&quot;one through five&quot;),     _ =&gt; println!(&quot;anything&quot;), }  let x = 1;  match x {     e @ 1 ... 5 =&gt; println!(&quot;got a range element {}&quot;, e),     _ =&gt; println!(&quot;anything&quot;), } <\/code><\/pre>\n<p>  <b>Swift<\/b> (\u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432\u0437\u044f\u0442 \u0438\u0437 swiftbook)  <\/p>\n<pre><code>let count = 3000000000000 let countedThings = &quot;stars in the Milky Way&quot; var naturalCount: String switch count { case 0:     naturalCount = &quot;no&quot; case 1...3:     naturalCount = &quot;a few&quot; case 4...9:     naturalCount = &quot;several&quot; case 10...99:     naturalCount = &quot;tens of&quot; case 100...999:     naturalCount = &quot;hundreds of&quot; case 1000...999999:     naturalCount = &quot;thousands of&quot; default:     naturalCount = &quot;millions and millions of&quot; } print(&quot;There are \\(naturalCount) \\(countedThings).&quot;) \/\/  \u0432\u044b\u0432\u0435\u0434\u0435\u0442 &quot;There are millions and millions of stars in the Milky Way.&quot;  let somePoint = (1, 1) switch somePoint { case (0, 0):     print(&quot;(0, 0) is at the origin&quot;) case (_, 0):     print(&quot;(\\(somePoint.0), 0) is on the x-axis&quot;) case (0, _):     print(&quot;(0, \\(somePoint.1)) is on the y-axis&quot;) case (-2...2, -2...2):     print(&quot;(\\(somePoint.0), \\(somePoint.1)) is inside the box&quot;) default:     print(&quot;(\\(somePoint.0), \\(somePoint.1)) is outside of the box&quot;) }\/\/ \u0432\u044b\u0432\u0435\u0434\u0435\u0442 &quot;(1, 1) is inside the box  let anotherPoint = (2, 0) switch anotherPoint { case (let x, 0):     print(&quot;on the x-axis with an x value of \\(x)&quot;) case (0, let y):     print(&quot;on the y-axis with a y value of \\(y)&quot;) case let (x, y):     print(&quot;somewhere else at (\\(x), \\(y))&quot;) } \/\/ \u0432\u044b\u0432\u0435\u0434\u0435\u0442 &quot;on the x-axis with an x value of 2 <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432 \u0446\u0435\u043b\u043e\u043c \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435. \u0412 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0430\u043b\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0442\u0435\u0436\u0438 \u0432 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u0425\u043e\u0442\u044f Rust \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0446\u0435\u043b\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0447\u0435\u0440\u0435\u0437 if \u0438 where. \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 swift \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c. \u0425\u043e\u0442\u044f \u044f \u0438 \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0438\u0434\u0435\u044f. <\/p>\n<h4>\u0411\u043e\u043b\u0435\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/h4>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%85%D1%8D%D0%BC%D0%B0\">\u0411\u0440\u0435\u0437\u0435\u043d\u0445\u0435\u043c\u0430<\/a>. \u0422\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435, \u0430 \u0432 \u0444\u043e\u0440\u043c\u0435 \u0434\u043b\u044f n\u043c\u0435\u0440\u043d\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u042d\u0442\u043e \u0432\u0441\u0451 \u043c\u043e\u0436\u0435\u0442 \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/248159\/\">\u043a\u0440\u0430\u0442\u043a\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c 3\u0445 \u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f:<br \/>  <b>rust<\/b>  <\/p>\n<pre><code class=\"rust\">#[derive(Copy, Clone, PartialEq)] struct Vec3 {     x: i32,     y: i32,     z: i32 }  impl Index&lt;usize&gt; for Vec3 {     type Output = i32;      fn index&lt;'a&gt;(&'a self, i: usize) -&gt; &'a Self::Output {         match i {             0   =&gt; &self.x,             1   =&gt; &self.y,             2   =&gt; &self.z,             _   =&gt; panic!(&quot;Wrong index&quot;),         }     } } impl IndexMut&lt;usize&gt; for Vec3 {     fn index_mut&lt;'a&gt;(&'a mut self, i: usize) -&gt; &'a mut Self::Output {         match i {             0   =&gt; &mut self.x,             1   =&gt; &mut self.y,             2   =&gt; &mut self.z,             _   =&gt; panic!(&quot;Wrong index&quot;),         }     }     } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>struct Vector3 {     var x: Int;     var y: Int;     var z: Int;      subscript(i: Int) -&gt; Int {         get {             precondition(i &gt;= 0 && i &lt; 3, &quot;Index out-of-bounds&quot;)             switch i {             case 0: return self.x             case 1: return self.y             case 2: return self.z             default: return 0             }         }         set {             precondition(i &gt;= 0 && i &lt; 3, &quot;Index out-of-bounds&quot;)             switch i {             case 0: self.x = newValue             case 1: self.y = newValue             case 2: self.z = newValue             default: break             }         }             } }  func == (left: Vector3, right: Vector3) -&gt; Bool {     return (left.x == right.x) && (left.y == right.y) && (left.z == right.z) } func != (left: Vector3, right: Vector3) -&gt; Bool {     return !(left == right) } <\/code><\/pre>\n<p>  \u0412 rust&#8217;\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0438\u043f\u0430\u0436\u0438, \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0442\u0438\u043f\u0430\u0436 Index, \u0442\u043e \u0434\u043b\u044f \u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 [], \u0432 swift&#8217;\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u0437\u044f\u0442\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 subscript \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043b\u043e\u0432\u0438\u044f. Rust \u0436\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0430\u0441\u0441\u0435\u0440\u0442\u044b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 swift \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435, \u0442\u0430\u043a \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435, \u043f\u0440\u0438\u0447\u0435\u043c \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432, \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u0412\u0441\u0451 \u044d\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0441\u0434\u0435\u043b\u0430\u0432 \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. Rust \u0436\u0435 \u0443\u043c\u0435\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f\u0430\u0436\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 derive, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0441\u0430\u043c\u043e\u043c\u0443 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a \u0446\u0432\u0435\u0442\u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b\u0434\u0432\u0438\u043d\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u0443\u043c\u0435\u043b\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0446\u0432\u0435\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0451 \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u043d\u043e\u0439:<\/p>\n<p>  <b>rust<\/b>  <\/p>\n<pre><code class=\"rust\">struct GenericPixmap&lt;T&gt; {     w: usize,     h: usize,          data: Vec&lt;T&gt;  }  impl&lt;T&gt; GenericPixmap&lt;T&gt;      where T: Copy + Clone  {     fn new(w: usize, h: usize, fill_value: T) -&gt; GenericPixmap&lt;T&gt; {         GenericPixmap {             w: w,             h: h,             data: vec![fill_value; w*h]         }     } }  impl&lt;T&gt; Index&lt;usize&gt; for  GenericPixmap&lt;T&gt;      where T: Copy + Clone  {     type Output = [T];      fn index&lt;'a&gt;(&'a self, i: usize) -&gt; &'a Self::Output {         let from = i*self.w;         let to = from+self.w;         &self.data[from..to]     } } impl&lt;T&gt; IndexMut&lt;usize&gt; for GenericPixmap&lt;T&gt;      where T: Copy + Clone  {     fn index_mut&lt;'a&gt;(&'a mut self, i: usize) -&gt; &'a mut Self::Output {         let from = i*self.w;         let to = from+self.w;         &mut self.data[from..to]     }     }  type Pixmap = GenericPixmap&lt;u32&gt;; <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>struct GenericPixmap&lt;T&gt; {     let w: Int     let h: Int      var data: [T]      init(width: Int, height: Int, fillValue: T) {         self.w = width         self.h = height         self.data = [T](count: w*h, repeatedValue: fillValue)     }      func indexIsValid(x: Int, _ y: Int) -&gt; Bool {         return x &gt;= 0 && x &lt; w && y &gt;= 0 && y &lt; h     }      subscript(x: Int, y: Int) -&gt; T {         get {             precondition(indexIsValid(x, y), &quot;Index out-of-bounds&quot;)             return data[x * y + y]         }         set {             precondition(indexIsValid(x,y), &quot;Index out-of-bounds&quot;)             data[x * y + y] = newValue         }     } }  typealias Pixmap = GenericPixmap&lt;UInt32&gt; <\/code><\/pre>\n<p>  \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 rust&#8217;\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043a\u043e\u043f\u0438\u044e. \u0412 swift&#8217;\u0435 \u0436\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c. \u0410 \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e init. \u042d\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e \u0432\u044b\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0438 \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u0447\u0430\u0442\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0442\u043e\u0447\u043d\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u043b\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d. \u0412 rust&#8217;\u0435 \u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0447\u043b\u0435\u043d\u043d\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 new. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0431\u0440\u0438\u043a\u0438. \u0427\u0442\u043e \u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0438\u0439, \u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 rust&#8217;\u0430 \u0432 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044f\u043c python, \u0430 swift \u0436\u0435 C++.<br \/>  \u0425\u043e\u0447\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432 swift \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043b\u044e\u0431\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0441\u0440\u0430\u0437\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0432 rust&#8217;\u0435 \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0440\u0435\u0437.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0438\u043f\u0430\u0436 Canvas, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c \u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<br \/>  <b>rust<\/b>  <\/p>\n<pre><code class=\"rust\">trait Canvas {     fn set_pixel(&mut self, x: usize, y:usize, color:u32); }  impl Canvas for Pixmap {     fn set_pixel(&mut self, x: usize, y:usize, color:u32)     {         self[x][y] = color;     } } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>protocol Canvas {     func setPixel(x: Int, _ y: Int, color: UInt32); }  class MyCanvas : Canvas {     var pixmap: Pixmap          init(width: Int, height: Int, fillValue: UInt32) {         self.pixmap = Pixmap(width:width, height:height, fillValue:fillValue)     }          func setPixel(x: Int, _ y: Int, color: UInt32)     {         pixmap[x, y] = color     } } <\/code><\/pre>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0441\u043c\u043e\u0433 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 GenericPixmap, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 MyCanvas, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Canvas, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 rust&#8217;\u0430 \u0432 swift&#8217;\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0411\u0440\u0435\u0437\u0435\u043d\u0445\u0435\u043c\u0430. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e \u0438\u0437 \u0442\u043e\u0447\u043a\u0438 (x1, y1, z1) \u0432 \u0442\u043e\u0447\u043a\u0443 (x2, y2, z2), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c (|x2-x1|, |y2-y1|, |z2-z1|) \u0448\u0430\u0433\u043e\u0432 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u043a\u043e\u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f (x2-x1, y2-y1, z2-z1).<br \/>  \u0418\u0442\u0430\u043a, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 (rx, ry, rz) \u0448\u0430\u0433\u043e\u0432 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 (sx, sy, sz), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043e\u0441\u044c, \u0432\u0434\u043e\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432. \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e (rx\/r[max, ry\/r[max], rz\/r[max]), \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0448\u0430\u0433 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 d \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e \u043e\u0441\u0438 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0448\u0430\u0433, \u0430 \u0438\u0437 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430. \u0422\u043e \u0435\u0441\u0442\u044c:  <\/p>\n<pre><code class=\"cpp\">d[i] += r[i] \/ r[max] if d[i] &gt;= 1 { r[i] -= s[i]; d[i] -= 1; } <\/code><\/pre>\n<p>  \u041d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0434\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0430 rmax, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u044f.  <\/p>\n<pre><code class=\"cpp\">d[i] += r[i] if d[i] &gt;= r[max] { r[i] -= s[i]; d[i] -= r[max]; } <\/code><\/pre>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0435\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0447\u0435\u043a \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 a \u0438 b. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u043e\u0447\u043a\u0430 a \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>  <b>rust<\/b>  <\/p>\n<pre><code class=\"rust\">struct RasterState {     step: Vec3,     d: Vec3,     major_axis: usize, }  struct LineRasterizer {     from: Vec3,     to: Vec3,      state: Option&lt;RasterState&gt; }  impl LineRasterizer {      fn new(from: Vec3, to: Vec3) -&gt; LineRasterizer {         LineRasterizer {             from: from,             to: to,             state: None         }     }      fn next_point(&mut self) -&gt; Option&lt;Vec3&gt; {         match self.state {             None =&gt; {                 let mut state = RasterState {                     step: Vec3 { x: 0, y: 0, z: 0 },                     d: Vec3 { x: 0, y: 0, z: 0 },                     major_axis: 0                 };                     let mut max = 0;                 for i in 0..3 {                     let d = self.to[i] - self.from[i];                     state.step[i] = if d &gt; 0 { 1 } else { -1 };                                          let d = d.abs();                     if d &gt; max {                         max = d;                         state.major_axis = i as usize;                     };                 }                  self.state = Some(state);                 Some(self.from)             },             Some(ref mut state) =&gt; {                 if self.from == self.to {                     None                 } else {                     let from = self.from; let to = self.to;                     let calc_residual_steps = |axis| { (to[axis] - from[axis]).abs() };                                          self.from[state.major_axis] += state.step[state.major_axis];                                         let rs_base = calc_residual_steps(state.major_axis);                     for i in 0..3 {                         let rs = calc_residual_steps(i);                                                  if rs &gt; 0 && i != state.major_axis {                             state.d[i] += rs;                             if state.d[i] &gt;= rs_base {                                 state.d[i] -= rs_base;                                 self.from[i] += state.step[i];                             }                         }                     }                                          Some(self.from)                 }             },         }     } } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>class LineRaster {      class State {         var step: Vector3         var d: Vector3         var majorAxis: Int          init() {             self.step = Vector3(x: 0, y: 0, z: 0)             self.d = Vector3(x: 0, y: 0, z: 0)             self.majorAxis = 0         }     }      var from: Vector3     let to: Vector3     var state: State?      init(from: Vector3, to: Vector3) {         self.from = from         self.to = to     }      func next_point() -&gt; Vector3? {         if let state = self.state {             if (self.from == self.to) {                 return nil             } else {                 let calsResidualSteps = {axis in return abs(self.to[axis] - self.from[axis])}                                  self.from[state.majorAxis] += state.step[state.majorAxis];                 let rsBase = calsResidualSteps(state.majorAxis);                 for i in 0..&lt;3 {                     let rs = calsResidualSteps(i);                                          if rs &gt; 0 && i != state.majorAxis {                         state.d[i] += rs;                         if state.d[i] &gt;= rsBase {                             state.d[i] -= rsBase;                             self.from[i] += state.step[i];                         }                     }                 }                                  return self.from             }         } else {             let state = State()             var max = 0;             for i in 0..&lt;3 {                 let d = self.to[i] - self.from[i];                 state.step[i] = d &gt; 0 ? 1 : -1;                                  let da = abs(d);                 if da &gt; max {                     max = da;                     state.majorAxis = i;                 };                             }             self.state = state             return self.from         }     } } <\/code><\/pre>\n<p>  \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043b\u0435\u0433\u043a\u043e \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 from \u0438\u0437 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432. \u0412 rust \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0435\u0440\u0435\u0437 enum Option, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u0432 swift&#8217;\u0435 \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u044f\u0437\u044b\u043a\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0448\u0443\u043c\u0430. <br \/>  \u0412 rust&#8217;\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0439, \u0447\u0442\u043e \u043c\u044b \u043e\u0434\u0430\u043b\u0436\u0438\u0432\u0430\u0435\u043c State \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e ref. \u0412 swift&#8217;\u0435 \u0436\u0435 State \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 move \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u0432 \u044f\u0437\u044b\u043a\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c state \u043d\u0438 \u043e \u0447\u0435\u043c \u043d\u0435 \u0437\u0430\u0431\u043e\u0442\u044f\u0441\u044c.<\/p>\n<p>  \u041f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0442\u0438\u043f\u0430:  <\/p>\n<pre><code>while let Some(point) = rasterizer.next_point() { ... } <\/code><\/pre>\n<p>  \u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u0437\u044f\u0449\u043d\u044b\u043c, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u0435\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442.  <\/p>\n<pre><code>for point in generator { ... } <\/code><\/pre>\n<p>  \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b for \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u0430\u0436\u0435\u0439 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430.<br \/>  <b>rust<\/b>  <\/p>\n<pre><code>impl Iterator for LineRasterizer {     type Item = Vec3;      fn next(&mut self) -&gt; Option&lt;Self::Item&gt; {         self.next_point()     } } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>extension LineRaster : GeneratorType {     func next() -&gt; Vector3? {         return self.next_point()     } }  extension LineRaster : SequenceType {     func generate() -&gt; LineRaster {         return self     } } <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u0447\u0435\u043c \u0434\u043b\u044f swift&#8217;\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0445 \u0434\u0432\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u0434\u043b\u044f rust&#8217;\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e, \u043d\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u044d\u0442\u043e \u043d\u0435 \u043d\u0435\u0441\u0451\u0442.<\/p>\n<h4>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u0440\u044f\u0435\u043c\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e<\/h4>\n<p>  \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0433\u043b\u0443\u043f\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u044f \u0437\u0430\u043c\u0435\u0440\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u041d\u0430\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p>  <b>rust<\/b>  <\/p>\n<pre><code>fn test_code(canvas: &mut Canvas) {     let a = Vec3 { x: 0, y:0, z:0 };     let b = Vec3 { x: 50, y: 55, z: -20 };      let rasterizer = LineRasterizer::new(a, b);     for point in rasterizer {         let color = std::u32::MAX;         canvas.set_pixel(point.x as usize, point.y as usize, color);     } }  for _ in 0..1000000 {     test_code(&mut canvas) } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>func testCode(canvas: Canvas) -&gt; () {     let a = Vector3(x: 0, y:0, z:0)     let b = Vector3(x: 50, y:55, z:-20)     let raster = LineRaster(from: a, to: b)     for point in raster {         let color = UInt32.max         canvas.setPixel(point.x, point.y, color: color)     } }  ...  var myCanvas: Canvas = canvas for _ in 0..&lt;1000000 {     testCode(myCanvas) } <\/code><\/pre>\n<p>  \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 Canvas \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u044f. <br \/>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c 0.86 \u0443 rust \u043f\u0440\u043e\u0442\u0438\u0432 5.3 \u0443 swift. \u0412\u043f\u043e\u043b\u043d\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e rust \u043a\u0430\u043a-\u0442\u043e \u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043b \u0432\u044b\u0437\u043e\u0432\u044b, \u0430 swift \u0436\u0435 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. <br \/>  <b>rust<\/b>  <\/p>\n<pre><code>fn test_code_generic&lt;T: Canvas&gt;(canvas: &mut T) {     let a = Vec3 { x: 0, y:0, z:0 };     let b = Vec3 { x: 50, y: 55, z: -20 };      let rasterizer = LineRasterizer::new(a, b);     for point in rasterizer {         let color = std::u32::MAX;         canvas.set_pixel(point.x as usize, point.y as usize, color);     } } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>func testCodeGeneric&lt;T:Canvas&gt;(canvas: T) -&gt; () {     let a = Vector3(x: 0, y:0, z:0)     let b = Vector3(x: 50, y:55, z:-20)     let raster = LineRaster(from: a, to: b)     for point in raster {         let color = UInt32.max         canvas.setPixel(point.x, point.y, color: color)     } } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b 0.83 \u0443 rust, \u043f\u0440\u043e\u0442\u0438\u0432 4.94 \u0443 swift, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 swift \u0441\u0443\u043c\u0435\u043b \u043b\u0443\u0447\u0448\u0435 \u0441\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u043e \u0433\u0434\u0435-\u0442\u043e \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0443\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d \u043d\u0435 \u0441\u043c\u043e\u0433 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c Canvas \u0432 box, \u0430 \u0434\u043b\u044f swift \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c inout, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u043f\u043e\u0434\u043e\u0431\u0435\u043d &#038;mut.<br \/>  <b>rust<\/b>  <\/p>\n<pre><code>fn test_code_boxed(canvas: &mut Box&lt;Canvas&gt;) {     let a = Vec3 { x: 0, y:0, z:0 };     let b = Vec3 { x: 50, y: 55, z: -20 };      let rasterizer = LineRasterizer::new(a, b);     for point in rasterizer {         let color = std::u32::MAX;         canvas.set_pixel(point.x as usize, point.y as usize, color);     } } <\/code><\/pre>\n<p>  <b>swift<\/b>  <\/p>\n<pre><code>func testCodeInout(inout canvas: Canvas) -&gt; () {     let a = Vector3(x: 0, y:0, z:0)     let b = Vector3(x: 50, y:55, z:-20)     let raster = LineRaster(from: a, to: b)     for point in raster {         let color = UInt32.max         canvas.setPixel(point.x, point.y, color: color)     } } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b 0.91 \u0443 rust, \u043f\u0440\u043e\u0442\u0438\u0432 6.44 \u0443 swift. <\/p>\n<p>  \u0411\u043e\u043a\u0441\u0438\u043d\u0433 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u043d\u043e \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0430 \u0432\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 inout \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u043e \u043d\u0430 swift. \u0412\u0438\u0434\u0438\u043c\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 canvas \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0443 \u0440\u0443\u043a\u0438.<\/p>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c \u0436\u0435 rust \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438 \u0441\u0445\u043e\u0436\u0435\u043c \u0441\u0442\u0438\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430. \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. Swift \u0436\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0435\u0437\u0434\u0435 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a, \u0447\u0442\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0443\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0443\u043c\u0435\u0435\u0442 \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0441\u0441\u044b\u043b\u043e\u043a \u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u044d\u0442\u043e \u043d\u0435 \u0434\u0430\u0441\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439, \u0447\u0442\u043e \u0432 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u043d \u0441\u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, Rust \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0434\u0430\u0441\u0442 \u043a\u043e\u0434\u0443 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043a\u0430\u043a \u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0437\u0440\u0435\u043b\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0442\u0430\u043a \u0438 \u043e\u0431 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432 \u043d\u0435\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439. <\/p>\n<p>  \u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c, \u043a\u0430\u043a rust \u0438 swift \u0441\u043c\u043e\u0442\u0440\u044f\u0442\u0441\u044f \u043d\u0430 \u0444\u043e\u043d\u0435 \u0441\u0442\u0430\u0440\u0438\u0447\u043a\u0430 C++.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u043f\u043e\u043b\u043d\u0435 \u043e\u0431\u044b\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;cassert&gt; #include &lt;memory&gt; #include &lt;cstdlib&gt;  template &lt;typename T&gt; struct GenericPixmap {     size_t w, h;     std::vector&lt;T&gt; data;      GenericPixmap(size_t w_, size_t h_, T fill_data = T()) :         w(w_), h(h_),         data(w_*h_, fill_data)     {      }      T* operator[] (size_t i)     {         return &data[i*w];     } };  struct Vec3 {     int x, y, z;      int& operator[] (size_t i)      {         assert(i &gt;=0 && i &lt; 3);         switch (i) {             case 0: return x;             case 1: return y;             case 2: return z;             default: break;         }         return z;     } };  bool operator== (const Vec3 &a, const Vec3 &b) {     return a.x == b.x && a.y == b.y && a.z && b.z; } bool operator!= (const Vec3 &a, const Vec3 &b) {     return !(a == b); }  struct RasterState {     Vec3 step;     Vec3 d;     size_t majorAxis; };  struct LineRaster {     Vec3 from;     Vec3 to;          bool firstStep;     RasterState state;      LineRaster(const Vec3 &f, const Vec3 &t) : from(f), to(t), firstStep(true), state{}     {}      bool next_point()     {         if (firstStep) {             size_t max = 0;             for (int i = 0; i &lt; 3; ++i) {                 auto d = to[i] - from[i];                 state.step[i] = d &gt; 0 ? 1 : -1;                  d = std::abs(d);                 if (d &gt; max) {                     max = d;                     state.majorAxis = i;                 }             }             firstStep = false;             return true;         } else {             if (from == to)                 return false;             else {                 auto calc_rs = [this](auto axis) { return std::abs(to[axis] - from[axis]); };                  from[state.majorAxis] += state.step[state.majorAxis];                 auto rs_base = calc_rs(state.majorAxis);                 for (int i = 0; i &lt; 3; ++i) {                     auto rs = calc_rs(i);                                          if (rs &gt; 0 && i != state.majorAxis) {                         state.d[i] += rs;                         if (state.d[i] &gt;= rs_base) {                             state.d[i] -= rs_base;                             from[i] += state.step[i];                         }                     }                 }                 return true;             }         }     } };  using Pixmap = GenericPixmap&lt;uint32_t&gt;;  void test_code(Pixmap &pixmap) {     Vec3 a { 0, 0, 0 };     Vec3 b { 50, 55, -20 };      LineRaster raster(a, b);     while (raster.next_point()) {         const auto &p = raster.from;         pixmap[p.x][p.y] = 0xFFFFFF;     } }  int main(int, char **) {     Pixmap pixmap(300, 300, 0);      Vec3 a { 0, 0, 0 };     Vec3 b { 10, 5, -4 };      LineRaster raster(a, b);     while (raster.next_point()) {         const auto &p = raster.from;          uint32_t color = 0xffffff;         pixmap[p.x][p.y] = color;         std::cout &lt;&lt; &quot;C++: point x:&quot; &lt;&lt; p.x &lt;&lt; &quot; y:&quot; &lt;&lt; p.y &lt;&lt; &quot; z:&quot; &lt;&lt; p.z &lt;&lt; &quot; color:&quot; &lt;&lt; color &lt;&lt; std::endl;     }      for (size_t i = 0; i &lt; 1000000; ++i)         test_code(pixmap); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0432 lldb, \u043f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  0.79 \u0443 rust, \u043f\u0440\u043e\u0442\u0438\u0432 0.31 \u0443 gcc.<\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d: \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b rust \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441 clang \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b gcc \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0432\u0437\u043e\u0448\u0435\u043b \u0432\u0441\u0435\u0445. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 llvm \u0435\u0441\u0442\u044c \u043a\u0443\u0434\u0430 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f, \u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0435\u0451 rust \u0443\u0436\u0435 \u0432 \u0441\u043f\u0438\u043d\u0443 \u0434\u044b\u0448\u0438\u0442 clang&#8217;\u0443, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435\u043c \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u043c\u0435\u043b\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0443\u0447\u0430\u0441\u0442\u043a\u0438. <\/p>\n<p>  \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 <a href=\"https:\/\/github.com\/alekseysidorov\/playground\/tree\/master\/swift_vs_rust\">github&#8217;\u0435<\/a>. \u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0441\u0451, \u0437\u0430 \u0431\u043e\u0440\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a, \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0441\u0432\u044f\u0437\u044c \u0441 \u043a\u043e\u0434\u043e\u043c \u043d\u0430 C \u0438\u043b\u0438 ObjectiveC, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438 \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0441\u043c\u043e\u0433\u0443 \u043a\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u0445 \u0432\u0435\u0449\u0435\u0439 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<h4>\u0412\u044b\u0432\u043e\u0434\u044b<\/h4>\n<p>  \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 swift&#8217;\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0434\u0435\u043b\u044f\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0430\u0445\u0430\u0440\u0430 \u0432 \u044f\u0437\u044b\u043a. Rust \u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0430\u0441\u043a\u0435\u0442\u0438\u0447\u0435\u043d \u0432 \u044d\u0442\u043e\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0435 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443. \u0417\u0430 \u0441\u0447\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 zero cost \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u043a\u043e\u0434 \u043d\u0430 Rust&#8217;\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0437\u0430\u0442\u043e \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f. Swift \u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043a\u043e\u0434 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c, \u0445\u043e\u0442\u044f \u0438 \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e rust&#8217;\u0443.<\/p>\n<p>  \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u043e \u0434\u043b\u044f swift&#8217;\u0430 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u0430\u044f ide XCode, \u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u043b\u0438\u0448\u044c \u0434\u043b\u044f MacosX, \u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0441 Cocoa \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f iOS \u0438\u043b\u0438 OsX. Rust \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0441argo \u0438 crates.io, \u0433\u0434\u0435 \u043e\u0431\u0438\u0442\u0430\u0435\u0442 \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u043e \u043f\u043e\u043a\u0430 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u043d\u0435\u0442 \u043d\u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u043e\u0439 ide \u043d\u0438 \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e gui \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. <\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0441\u0447\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 swift&#8217;\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0440\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438, \u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434 Rust&#8217;\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0421\u0442\u0440\u043e\u0433\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0435\u0440\u0435\u0436\u0435\u0442 \u0432\u0430\u0441 \u043e\u0442 \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u0412\u0430\u043a\u0430\u043d\u0441\u0438\u0439 \u043d\u0430 swift \u0441\u0435\u0439\u0447\u0430\u0441 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u044c\u0448\u0435, \u0434\u0430 \u0438 \u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u043e\u0449\u0435, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e rust&#8217;\u0443 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u044b. \u0414\u0443\u043c\u0430\u044e \u0432 \u043c\u0438\u0440\u0435 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u0430\u043b\u043e \u0437\u0430\u0434\u0430\u0447, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0431\u0430 \u044d\u0442\u0438\u0445 \u044f\u0437\u044b\u043a\u0430 \u0431\u0443\u0434\u0443\u0442 \u0431\u0435\u0437\u0436\u0430\u043b\u043e\u0441\u0442\u043d\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0438, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e \u043f\u043e\u0439\u0434\u0435\u0442 \u0438\u043c \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u0443.<\/p>\n<h4>\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435<\/h4>\n<p>  \u0411\u0435\u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u0435\u043d \u0438 \u0430\u0441\u043a\u0435\u0442\u0438\u0447\u0435\u043d rust, \u0421\u0432\u0435\u0442\u043b\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0431\u043b\u0430\u0433\u043e\u043f\u0440\u0438\u044f\u0442\u0435\u043d \u043e\u043d, swift \u0436\u0435 \u0441\u0430\u0445\u0430\u0440\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0432\u043e\u0438\u043c \u043d\u0430 \u0422\u0435\u043c\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442.               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/272681\/\"> http:\/\/habrahabr.ru\/post\/272681\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/01e\/b90\/7e1\/01eb907e1a0345b096f1aab0e7070ca6.png\" align=\"left\"\/><br \/>  \u041f\u043e\u0432\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0442\u0430\u043b\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u044f\u0437\u044b\u043a\u0430 swift \u2014 \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0431\u043b\u0438\u0436\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u043d\u0438\u043c. \u0412 \u0433\u043b\u0430\u0437\u0430 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0431\u0440\u043e\u0441\u0438\u043b\u0430\u0441\u044c \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u043b\u043e\u0434\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c rust, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0437\u0430 \u0441\u0445\u043e\u0436\u0438\u043c\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u0438 \u0441\u0445\u043e\u0436\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u041e\u0431\u0430 \u044f\u0437\u044b\u043a\u0430 \u0438\u043c\u0435\u044e\u0442 \u0441\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0442\u0438\u043f\u043e\u0432, \u043e\u0431\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0418 \u0442\u043e\u0442 \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a\u0438 \u0432\u043f\u0438\u0442\u0430\u043b\u0438 \u0432 \u0441\u0435\u0431\u044f \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u0438\u0437 \u043c\u0438\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0418 swift \u0438 rust \u0438\u043c\u0435\u044e\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 C, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437 \u0442\u0440\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041e\u0431\u0430 \u044f\u0437\u044b\u043a\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0437\u0430\u043c\u0435\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u0430\u043c \u0442\u0438\u043f\u0430 C, C++, ObjectiveC. \u0422\u0430\u043a \u0447\u0442\u043e \u0436\u0435 \u0432 \u043d\u0438\u0445 \u043e\u0431\u0449\u0435\u0433\u043e, \u0430 \u0447\u0442\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f?  <\/p>\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-270687","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/270687","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=270687"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/270687\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=270687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=270687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=270687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}