{"action":"created","comment":{"url":"https://api.github.com/repos/kgv/rust_book_ru/pulls/comments/30465257","id":30465257,"diff_hunk":"@@ -1,3 +1,586 @@\n % Стек и Куча\n \n-Скоро!\n+Как любой системный язык программирования, Rust работает на низком уровне. Если\n+вы пришли из языка высокого уровня, то вам могут быть незнакомы некоторые\n+аспекты системного программирования. Наиболее важными из них являются те,\n+которые касаются работы с памятью в стеке и в куче. Если вы уже знакомы с тем,\n+как в C-подобных языках используется выделение памяти в стеке, то эта глава\n+освежит ваши знания. Если же вы еще не знакомы с этим, то узнаете об этом более\n+общей концепции, но с акцентом на Rust.\n+\n+# Управление памятью\n+\n+Эти два термина касаются управления памятью. Стек и куча - это абстракции,\n+которые помогают вам определить, когда требуется выделение и освобождение\n+памяти.\n+\n+Вот высокоуровневое сравнение:\n+\n+Стек работает очень быстро, в Rust память выделяется в стеке по умолчанию.\n+Выделение памяти в стеке является локальным по отношению к вызову функции, и\n+имеет ограниченный размер. Куча, с другой стороны, работает медленнее, а\n+выделение памяти в куче осуществляется в программе явно. Но такая память имеет\n+эффективно неограниченный размер, и глобально доступна.\n+\n+# Стек\n+\n+Давайте поговорим о следующей программе на Rust:\n+\n+```rust\n+fn main() {\n+    let x = 42;\n+}\n+```\n+\n+Эта программа имеет одно связывание переменной, `x`. Память для этого необходимо\n+где-то выделить. Rust по умолчанию \"выделяет память в стеке\", что означает, что\n+переменные \"помещаются в стеке\". Что это значит?\n+\n+Хорошо, когда функция вызывается, то выделяется некоторый объем памяти для всех\n+её локальных переменных и некоторой дополнительной информации. Это называется\n+\"стековый фрейм\" (кадр), в этом туториале мы будем игнорировать эту\n+дополнительную информацию, и будем рассматривать лишь локальные переменные,\n+которые мы выделяем. Таким образом, в этом случае, когда выполняется `main()`,\n+мы выделяем одно 32-битное целое число в нашем фрейме стека. Как вы можете\n+видеть, это происходит автоматически, мы не должны писать какой-либо специальный\n+код на Rust или что-нибудь ещё для этого.\n+\n+Когда функция завершается, её стековый фрейм освобождается. Это происходит\n+автоматически, мы не должны делать что-либо специальное для этого.\n+\n+Вот и все, что касается этой простой программы. Главное, что здесь нужно понять,\n+это что выделение в стеке очень, очень быстро. Поскольку нам известны все\n+локальные переменные заранее, то мы можем выделить для них сразу всю память\n+единовременно. И так как они, как правило, одновременно выходят из области\n+своего определения, то мы можем освободить выделенную память также очень быстро.\n+\n+Недостатком является то, что мы не можем хранить необходимые значения дольше,\n+чем в рамках одной функции. Мы ещё не говорили о том, что же означает название\n+\"Стек\". Для этого мы должны привести немного более сложный пример:\n+\n+```rust\n+fn foo() {\n+    let y = 5;\n+    let z = 100;\n+}\n+\n+fn main() {\n+    let x = 42;\n+\n+    foo();\n+}\n+```\n+\n+Эта программа имеет в общей сложности три переменные: две в `foo()`, одну в\n+`main()`. Так же как и раньше, когда вызывается `main()`, в её стековом фрейме\n+выделяется одно целое число. Но, прежде чем мы сможем показать, что происходит,\n+когда вызывается `foo()`, мы должны визуализировать то, что происходит с\n+памятью. Ваша операционная система представляет отображение памяти для вашей\n+программы, это довольно просто: огромный список адресов, от 0 до большого числа,\n+представляющего количество оперативной памяти у вашего компьютера. Например,\n+если у вас есть гигабайт оперативной памяти, то ваши адреса будут от `0` до\n+`1,073,741,824`. Это число получается из `2<sup>30</sup>`, число байтов в\n+гигабайте.\n+\n+Эта память вроде гигантского массива: адреса начинаются с нуля и продолжаются до\n+конечного числа. Так вот схема нашего первого кадра стека:\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 0       | x    | 42    |\n+\n+У нас есть переменная `x`, расположенная по адресу `0`, имеющая значение `42`.\n+\n+Когда вызывается `foo()`, выделяется новый стековый фрейм:\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 2       | z    | 100   |\n+| 1       | y    | 5     |\n+| 0       | x    | 42    |\n+\n+Поскольку `0` было задействовано в первом фрейме, для фрейма `foo()`\n+используются `1` и `2`. Стек растет вверх, для дальнейших функций, которые мы\n+вызываем.\n+\n+\n+Здесь необходимо принять к сведению некоторые важные замечания. Адреса 0, 1 и 2\n+приведены исключительно в иллюстративных целях, и не имеют никакого отношения к\n+фактическим адресам, которые компьютер будет использовать. В частности, набор\n+адресов в действительности включает разделители, состоящие из некоторого числа\n+байтов, которые отделяют каждый из адресов, и размер этого разделителя может\n+даже превышать размер хранящегося значения.\n+\n+После того, как `foo()` завершается, её фрейм будет освобожден:\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 0       | x    | 42    |\n+\n+А потом, после `main()`, даже это последнее значение уходит. Легко!\n+\n+Это называется \"стек\", потому что он работает как стек тарелок: первая тарелка,\n+которую вы положили, будет последней тарелкой, которую вы возьмете обратно. Стек\n+иногда называют \"последним пришел, первым вышел очередью\" по этой причине,\n+потому что последнее значение, которое вы положили в стек, будет первым, которое\n+вы получите из него.\n+\n+Давайте попробуем трех-уровневый пример:\n+\n+```rust\n+fn bar() {\n+    let i = 6;\n+}\n+\n+fn foo() {\n+    let a = 5;\n+    let b = 100;\n+    let c = 1;\n+\n+    bar();\n+}\n+\n+fn main() {\n+    let x = 42;\n+\n+    foo();\n+}\n+```\n+\n+Хорошо, сначала вызывается `main()`:\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 0       | x    | 42    |\n+\n+Затем из `main()` вызывается `foo()`:\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 3       | c    | 1     |\n+| 2       | b    | 100   |\n+| 1       | a    | 5     |\n+| 0       | x    | 42    |\n+\n+И затем из `foo()` вызывается `bar()`:\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 4       | i    | 6     |\n+| 3       | c    | 1     |\n+| 2       | b    | 100   |\n+| 1       | a    | 5     |\n+| 0       | x    | 42    |\n+\n+Уф! Наш стек растет вверх.\n+\n+После того, как `bar()` завершается, её фрейм будет освобожден, оставляя только\n+`foo()` и `main()`:\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 3       | c    | 1     |\n+| 2       | b    | 100   |\n+| 1       | a    | 5     |\n+| 0       | x    | 42    |\n+\n+И затем завершается `foo()`, оставляя только `main()`\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 0       | x    | 42    |\n+\n+И вот мы закончили. Уловили суть? Это как стопка тарелок: вы кладете наверх, и\n+вы берете сверху.\n+\n+# Куча\n+\n+Такой способ выделения памяти работает очень хорошо, но он не всегда может быть\n+использован. Иногда вам необходимо передать некоторую память между различными\n+функциями или сохранить её валидность после окончания выполнения функции. Для\n+этого, мы можем использовать кучу.\n+\n+В Rust, вы можете выделить память в куче с помощью [типа `Box<T>`][box]. Вот\n+пример:\n+\n+```rust\n+fn main() {\n+    let x = Box::new(5);\n+    let y = 42;\n+}\n+```\n+\n+[box]: ../std/boxed/index.html\n+\n+Вот что происходит с памятью, когда вызывается `main()`:\n+\n+| Address | Name | Value  |\n+|---------|------|--------|\n+| 1       | y    | 42     |\n+| 0       | x    | ?????? |\n+\n+Мы выделяем место для двух переменных в стеке. `y` представляет собой `42`, тут\n+всё как обычно, но что насчёт `x`? Хорошо, `x` представляет собой `Box<i32>`, а\n+боксы выделяют память в куче. Фактическое значение бокса - структура, которая\n+имеет указатель на \"кучу\". Когда начинает выполняться функция, осуществляется\n+вызов `Box::new()`, который выделяет некоторый объем памяти в куче, и кладет\n+туда `5`. Память в настоящее время выглядит следующим образом:\n+\n+| Address         | Name | Value          |\n+|-----------------|------|----------------|\n+| 2<sup>30</sup>  |      | 5              |\n+| ...             | ...  | ...            |\n+| 1               | y    | 42             |\n+| 0               | x    | 2<sup>30</sup> |\n+\n+У нас есть 2<sup>30</sup> в нашем гипотетическом компьютере с 1Гб оперативной\n+памяти. А так как наш стек растет от нуля, то проще всего выделить память с\n+другого конца. Таким образом, наше первое значение находится на самом высоком\n+месте в памяти. А значением структуры в `x` является [сырой\n+указатель][rawpointer] на адрес, который мы выделили в куче, так что значение\n+`x` равно 2<sup>30</sup>, это то самое местоположение в памяти.\n+\n+[rawpointer]: raw-pointers.html\n+\n+Мы не слишком много говорили о том, что на самом деле означает выделить и\n+освободить память в этих контекстах. Чрезмерное углубление в детали по этому\n+вопросу выходит за рамки данного руководства, но важно отметить, что куча - это\n+не просто стек, который растет с противоположного конца. Как мы увидим в\n+примерах в этой книге дальше, память из кучи может быть выделена и освобождена в\n+любом порядке, что в конечном итоге может привести к \"дыркам\". Вот схема\n+размещения памяти программы, проработавшей в течение некоторого времени:\n+\n+| Address              | Name | Value                |\n+|----------------------|------|----------------------|\n+| 2<sup>30</sup>       |      | 5                    |\n+| (2<sup>30</sup>) - 1 |      |                      |\n+| (2<sup>30</sup>) - 2 |      |                      |\n+| (2<sup>30</sup>) - 3 |      | 42                   |\n+| ...                  | ...  | ...                  |\n+| 3                    | y    | (2<sup>30</sup>) - 3 |\n+| 2                    | y    | 42                   |\n+| 1                    | y    | 42                   |\n+| 0                    | x    | 2<sup>30</sup>       |\n+\n+В этом примере мы выделили четыре элемента в куче, но освободили лишь два из\n+них. Отсюда разрыв между 2<sup>30</sup> и (2<sup>30</sup>) - 3, который в\n+настоящее время не используется. Конкретные детали того, как и почему это\n+происходит, зависят от того, какую стратегию вы используете для управления\n+кучей. Различные программы могут использовать различные \"распределители памяти\",\n+которые представляют собой библиотеки, которые управляют памятью за вас. Rust\n+программы используют [jemalloc][jemalloc] для этой цели.\n+\n+[jemalloc]: http://www.canonware.com/jemalloc/\n+\n+Короче, вернемся к нашему примеру. Так как эта память расположена в куче, то она\n+может оставаться в живых (валидной) дольше, чем функция, которые выделяет бокс.\n+В данном случае, однако, это не так.[^moving] Когда функция завершается, мы\n+должны освободить фрейм стека для `main()`. Хотя у `Box<T>` для этого есть свой\n+трюк: [Drop][drop]. Реализация `Drop` для `Box` освобождает память, которая была\n+выделена при создании. Отлично! Поэтому, когда `x` уходит, сначала освобождается\n+память, выделенная в куче:\n+\n+| Address | Name | Value  |\n+|---------|------|--------|\n+| 1       | y    | 42     |\n+| 0       | x    | ?????? |\n+\n+[drop]: drop.html\n+[moving]: Мы можем сделать время жизни памяти более долгим путем передачи права\n+          собственности, что иногда называют \"перемещение из бокса\" (\"moving out\n+          of the box\"). Более сложные примеры будут рассмотрены позже.\n+\n+\n+А потом фрейм стека уходит, освобождая всю нашу память.\n+\n+# Аргументы и заимствование\n+\n+У нас есть некоторые простые примеры со стеком и кучей, но что насчёт аргументов\n+функции и заимствования? Вот небольшая программа на Rust:\n+\n+```rust\n+fn foo(i: &i32) {\n+    let z = 42;\n+}\n+\n+fn main() {\n+    let x = 5;\n+    let y = &x;\n+\n+    foo(y);\n+}\n+```\n+\n+Когда мы входим в `main()`, память выглядит следующим образом:\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 1       | y    | 0     |\n+| 0       | x    | 5     |\n+\n+Значением `x` является `5`, а `y` представляет собой ссылку на `x`. То есть, ее\n+значением является адрес памяти, в котором расположен `x`, который в данном\n+случае является `0`.\n+\n+А что насчёт случая, когда мы вызываем `foo()`, передавая `y` в качестве\n+аргумента?\n+\n+| Address | Name | Value |\n+|---------|------|-------|\n+| 3       | z    | 42    |\n+| 2       | i    | 0     |\n+| 1       | y    | 0     |\n+| 0       | x    | 5     |\n+\n+Фреймы стека используются не только для локальных привязок, но также и для\n+аргументов. Таким образом, в этом случае, наш фрейм должен содержать как `i`,\n+наш аргумент, так и `z`, нашу привязку локальной переменной. `i` - это копия\n+аргумента `y`. Соответственно, значением `i`, как и значением `y`, является `0`.\n+\n+Это одна из причин, почему заимствование переменной не освобождает какую-либо\n+память: значением ссылки является просто указатель на область памяти. Если мы\n+освободим нижележащую по этому указателю память, то это может привести к ошибкам\n+в дальнейшей работе.\n+\n+# Комплексный пример\n+\n+Хорошо, давайте рассмотрим следующую комплексную программу шаг за шагом:\n+\n+```rust\n+fn foo(x: &i32) {\n+    let y = 10;\n+    let z = &y;\n+\n+    baz(z);\n+    bar(x, z);\n+}\n+\n+fn bar(a: &i32, b: &i32) {\n+    let c = 5;\n+    let d = Box::new(5);\n+    let e = &d;\n+\n+    baz(e);\n+}\n+\n+fn baz(f: &i32) {\n+    let g = 100;\n+}\n+\n+fn main() {\n+    let h = 3;\n+    let i = Box::new(20);\n+    let j = &h;\n+\n+    foo(j);\n+}\n+```\n+\n+Сначала, мы вызываем `main()`:\n+\n+| Address         | Name | Value          |\n+|-----------------|------|----------------|\n+| 2<sup>30</sup>  |      | 20             |\n+| ...             | ...  | ...            |\n+| 2               | j    | 0              |\n+| 1               | i    | 2<sup>30</sup> |\n+| 0               | h    | 3              |\n+\n+Мы выделяем память для `j`, `i`, и `h`. `i` выделна в куче и поэтому содержит","path":"the-stack-and-the-heap.md","position":390,"original_position":390,"commit_id":"43d6fad2220193bd78bf35e7d6645d28ee0b8b50","original_commit_id":"43d6fad2220193bd78bf35e7d6645d28ee0b8b50","user":{"login":"mkpankov","id":393741,"avatar_url":"https://avatars.githubusercontent.com/u/393741?v=3","gravatar_id":"","url":"https://api.github.com/users/mkpankov","html_url":"https://github.com/mkpankov","followers_url":"https://api.github.com/users/mkpankov/followers","following_url":"https://api.github.com/users/mkpankov/following{/other_user}","gists_url":"https://api.github.com/users/mkpankov/gists{/gist_id}","starred_url":"https://api.github.com/users/mkpankov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mkpankov/subscriptions","organizations_url":"https://api.github.com/users/mkpankov/orgs","repos_url":"https://api.github.com/users/mkpankov/repos","events_url":"https://api.github.com/users/mkpankov/events{/privacy}","received_events_url":"https://api.github.com/users/mkpankov/received_events","type":"User","site_admin":false},"body":"выделена","created_at":"2015-05-16T22:12:09Z","updated_at":"2015-05-16T22:12:09Z","html_url":"https://github.com/kgv/rust_book_ru/pull/76#discussion_r30465257","pull_request_url":"https://api.github.com/repos/kgv/rust_book_ru/pulls/76","_links":{"self":{"href":"https://api.github.com/repos/kgv/rust_book_ru/pulls/comments/30465257"},"html":{"href":"https://github.com/kgv/rust_book_ru/pull/76#discussion_r30465257"},"pull_request":{"href":"https://api.github.com/repos/kgv/rust_book_ru/pulls/76"}}},"pull_request":{"url":"https://api.github.com/repos/kgv/rust_book_ru/pulls/76","id":35575105,"html_url":"https://github.com/kgv/rust_book_ru/pull/76","diff_url":"https://github.com/kgv/rust_book_ru/pull/76.diff","patch_url":"https://github.com/kgv/rust_book_ru/pull/76.patch","issue_url":"https://api.github.com/repos/kgv/rust_book_ru/issues/76","number":76,"state":"open","locked":false,"title":"Translate the-stack-and-the-heap.md.","user":{"login":"kgv","id":863800,"avatar_url":"https://avatars.githubusercontent.com/u/863800?v=3","gravatar_id":"","url":"https://api.github.com/users/kgv","html_url":"https://github.com/kgv","followers_url":"https://api.github.com/users/kgv/followers","following_url":"https://api.github.com/users/kgv/following{/other_user}","gists_url":"https://api.github.com/users/kgv/gists{/gist_id}","starred_url":"https://api.github.com/users/kgv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kgv/subscriptions","organizations_url":"https://api.github.com/users/kgv/orgs","repos_url":"https://api.github.com/users/kgv/repos","events_url":"https://api.github.com/users/kgv/events{/privacy}","received_events_url":"https://api.github.com/users/kgv/received_events","type":"User","site_admin":false},"body":"Соответствует коммиту оригинала 785cbe3ac9ae6f79055f87edbbb3128c0db2253b\r\nНачиная с `# Что использовать?` требует переформулировки.\r\n","created_at":"2015-05-16T18:25:13Z","updated_at":"2015-05-16T22:12:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"19f87887f71118c9aaefc18725b805e201b2add8","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/kgv/rust_book_ru/pulls/76/commits","review_comments_url":"https://api.github.com/repos/kgv/rust_book_ru/pulls/76/comments","review_comment_url":"https://api.github.com/repos/kgv/rust_book_ru/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kgv/rust_book_ru/issues/76/comments","statuses_url":"https://api.github.com/repos/kgv/rust_book_ru/statuses/43d6fad2220193bd78bf35e7d6645d28ee0b8b50","head":{"label":"kgv:the-stack-and-the-heap","ref":"the-stack-and-the-heap","sha":"43d6fad2220193bd78bf35e7d6645d28ee0b8b50","user":{"login":"kgv","id":863800,"avatar_url":"https://avatars.githubusercontent.com/u/863800?v=3","gravatar_id":"","url":"https://api.github.com/users/kgv","html_url":"https://github.com/kgv","followers_url":"https://api.github.com/users/kgv/followers","following_url":"https://api.github.com/users/kgv/following{/other_user}","gists_url":"https://api.github.com/users/kgv/gists{/gist_id}","starred_url":"https://api.github.com/users/kgv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kgv/subscriptions","organizations_url":"https://api.github.com/users/kgv/orgs","repos_url":"https://api.github.com/users/kgv/repos","events_url":"https://api.github.com/users/kgv/events{/privacy}","received_events_url":"https://api.github.com/users/kgv/received_events","type":"User","site_admin":false},"repo":{"id":32290526,"name":"rust_book_ru","full_name":"kgv/rust_book_ru","owner":{"login":"kgv","id":863800,"avatar_url":"https://avatars.githubusercontent.com/u/863800?v=3","gravatar_id":"","url":"https://api.github.com/users/kgv","html_url":"https://github.com/kgv","followers_url":"https://api.github.com/users/kgv/followers","following_url":"https://api.github.com/users/kgv/following{/other_user}","gists_url":"https://api.github.com/users/kgv/gists{/gist_id}","starred_url":"https://api.github.com/users/kgv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kgv/subscriptions","organizations_url":"https://api.github.com/users/kgv/orgs","repos_url":"https://api.github.com/users/kgv/repos","events_url":"https://api.github.com/users/kgv/events{/privacy}","received_events_url":"https://api.github.com/users/kgv/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kgv/rust_book_ru","description":"The Rust Programming Language (на русском)","fork":false,"url":"https://api.github.com/repos/kgv/rust_book_ru","forks_url":"https://api.github.com/repos/kgv/rust_book_ru/forks","keys_url":"https://api.github.com/repos/kgv/rust_book_ru/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kgv/rust_book_ru/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kgv/rust_book_ru/teams","hooks_url":"https://api.github.com/repos/kgv/rust_book_ru/hooks","issue_events_url":"https://api.github.com/repos/kgv/rust_book_ru/issues/events{/number}","events_url":"https://api.github.com/repos/kgv/rust_book_ru/events","assignees_url":"https://api.github.com/repos/kgv/rust_book_ru/assignees{/user}","branches_url":"https://api.github.com/repos/kgv/rust_book_ru/branches{/branch}","tags_url":"https://api.github.com/repos/kgv/rust_book_ru/tags","blobs_url":"https://api.github.com/repos/kgv/rust_book_ru/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kgv/rust_book_ru/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kgv/rust_book_ru/git/refs{/sha}","trees_url":"https://api.github.com/repos/kgv/rust_book_ru/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kgv/rust_book_ru/statuses/{sha}","languages_url":"https://api.github.com/repos/kgv/rust_book_ru/languages","stargazers_url":"https://api.github.com/repos/kgv/rust_book_ru/stargazers","contributors_url":"https://api.github.com/repos/kgv/rust_book_ru/contributors","subscribers_url":"https://api.github.com/repos/kgv/rust_book_ru/subscribers","subscription_url":"https://api.github.com/repos/kgv/rust_book_ru/subscription","commits_url":"https://api.github.com/repos/kgv/rust_book_ru/commits{/sha}","git_commits_url":"https://api.github.com/repos/kgv/rust_book_ru/git/commits{/sha}","comments_url":"https://api.github.com/repos/kgv/rust_book_ru/comments{/number}","issue_comment_url":"https://api.github.com/repos/kgv/rust_book_ru/issues/comments{/number}","contents_url":"https://api.github.com/repos/kgv/rust_book_ru/contents/{+path}","compare_url":"https://api.github.com/repos/kgv/rust_book_ru/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kgv/rust_book_ru/merges","archive_url":"https://api.github.com/repos/kgv/rust_book_ru/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kgv/rust_book_ru/downloads","issues_url":"https://api.github.com/repos/kgv/rust_book_ru/issues{/number}","pulls_url":"https://api.github.com/repos/kgv/rust_book_ru/pulls{/number}","milestones_url":"https://api.github.com/repos/kgv/rust_book_ru/milestones{/number}","notifications_url":"https://api.github.com/repos/kgv/rust_book_ru/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kgv/rust_book_ru/labels{/name}","releases_url":"https://api.github.com/repos/kgv/rust_book_ru/releases{/id}","created_at":"2015-03-15T23:43:17Z","updated_at":"2015-05-16T18:24:44Z","pushed_at":"2015-05-16T21:46:39Z","git_url":"git://github.com/kgv/rust_book_ru.git","ssh_url":"git@github.com:kgv/rust_book_ru.git","clone_url":"https://github.com/kgv/rust_book_ru.git","svn_url":"https://github.com/kgv/rust_book_ru","homepage":"https://www.gitbook.com/book/kgv/rust_book_ru","size":3113,"stargazers_count":18,"watchers_count":18,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":9,"mirror_url":null,"open_issues_count":12,"forks":9,"open_issues":12,"watchers":18,"default_branch":"master"}},"base":{"label":"kgv:master","ref":"master","sha":"f18e0d464165b8389f998581c964dacaad989833","user":{"login":"kgv","id":863800,"avatar_url":"https://avatars.githubusercontent.com/u/863800?v=3","gravatar_id":"","url":"https://api.github.com/users/kgv","html_url":"https://github.com/kgv","followers_url":"https://api.github.com/users/kgv/followers","following_url":"https://api.github.com/users/kgv/following{/other_user}","gists_url":"https://api.github.com/users/kgv/gists{/gist_id}","starred_url":"https://api.github.com/users/kgv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kgv/subscriptions","organizations_url":"https://api.github.com/users/kgv/orgs","repos_url":"https://api.github.com/users/kgv/repos","events_url":"https://api.github.com/users/kgv/events{/privacy}","received_events_url":"https://api.github.com/users/kgv/received_events","type":"User","site_admin":false},"repo":{"id":32290526,"name":"rust_book_ru","full_name":"kgv/rust_book_ru","owner":{"login":"kgv","id":863800,"avatar_url":"https://avatars.githubusercontent.com/u/863800?v=3","gravatar_id":"","url":"https://api.github.com/users/kgv","html_url":"https://github.com/kgv","followers_url":"https://api.github.com/users/kgv/followers","following_url":"https://api.github.com/users/kgv/following{/other_user}","gists_url":"https://api.github.com/users/kgv/gists{/gist_id}","starred_url":"https://api.github.com/users/kgv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kgv/subscriptions","organizations_url":"https://api.github.com/users/kgv/orgs","repos_url":"https://api.github.com/users/kgv/repos","events_url":"https://api.github.com/users/kgv/events{/privacy}","received_events_url":"https://api.github.com/users/kgv/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kgv/rust_book_ru","description":"The Rust Programming Language (на русском)","fork":false,"url":"https://api.github.com/repos/kgv/rust_book_ru","forks_url":"https://api.github.com/repos/kgv/rust_book_ru/forks","keys_url":"https://api.github.com/repos/kgv/rust_book_ru/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kgv/rust_book_ru/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kgv/rust_book_ru/teams","hooks_url":"https://api.github.com/repos/kgv/rust_book_ru/hooks","issue_events_url":"https://api.github.com/repos/kgv/rust_book_ru/issues/events{/number}","events_url":"https://api.github.com/repos/kgv/rust_book_ru/events","assignees_url":"https://api.github.com/repos/kgv/rust_book_ru/assignees{/user}","branches_url":"https://api.github.com/repos/kgv/rust_book_ru/branches{/branch}","tags_url":"https://api.github.com/repos/kgv/rust_book_ru/tags","blobs_url":"https://api.github.com/repos/kgv/rust_book_ru/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kgv/rust_book_ru/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kgv/rust_book_ru/git/refs{/sha}","trees_url":"https://api.github.com/repos/kgv/rust_book_ru/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kgv/rust_book_ru/statuses/{sha}","languages_url":"https://api.github.com/repos/kgv/rust_book_ru/languages","stargazers_url":"https://api.github.com/repos/kgv/rust_book_ru/stargazers","contributors_url":"https://api.github.com/repos/kgv/rust_book_ru/contributors","subscribers_url":"https://api.github.com/repos/kgv/rust_book_ru/subscribers","subscription_url":"https://api.github.com/repos/kgv/rust_book_ru/subscription","commits_url":"https://api.github.com/repos/kgv/rust_book_ru/commits{/sha}","git_commits_url":"https://api.github.com/repos/kgv/rust_book_ru/git/commits{/sha}","comments_url":"https://api.github.com/repos/kgv/rust_book_ru/comments{/number}","issue_comment_url":"https://api.github.com/repos/kgv/rust_book_ru/issues/comments{/number}","contents_url":"https://api.github.com/repos/kgv/rust_book_ru/contents/{+path}","compare_url":"https://api.github.com/repos/kgv/rust_book_ru/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kgv/rust_book_ru/merges","archive_url":"https://api.github.com/repos/kgv/rust_book_ru/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kgv/rust_book_ru/downloads","issues_url":"https://api.github.com/repos/kgv/rust_book_ru/issues{/number}","pulls_url":"https://api.github.com/repos/kgv/rust_book_ru/pulls{/number}","milestones_url":"https://api.github.com/repos/kgv/rust_book_ru/milestones{/number}","notifications_url":"https://api.github.com/repos/kgv/rust_book_ru/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kgv/rust_book_ru/labels{/name}","releases_url":"https://api.github.com/repos/kgv/rust_book_ru/releases{/id}","created_at":"2015-03-15T23:43:17Z","updated_at":"2015-05-16T18:24:44Z","pushed_at":"2015-05-16T21:46:39Z","git_url":"git://github.com/kgv/rust_book_ru.git","ssh_url":"git@github.com:kgv/rust_book_ru.git","clone_url":"https://github.com/kgv/rust_book_ru.git","svn_url":"https://github.com/kgv/rust_book_ru","homepage":"https://www.gitbook.com/book/kgv/rust_book_ru","size":3113,"stargazers_count":18,"watchers_count":18,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":9,"mirror_url":null,"open_issues_count":12,"forks":9,"open_issues":12,"watchers":18,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kgv/rust_book_ru/pulls/76"},"html":{"href":"https://github.com/kgv/rust_book_ru/pull/76"},"issue":{"href":"https://api.github.com/repos/kgv/rust_book_ru/issues/76"},"comments":{"href":"https://api.github.com/repos/kgv/rust_book_ru/issues/76/comments"},"review_comments":{"href":"https://api.github.com/repos/kgv/rust_book_ru/pulls/76/comments"},"review_comment":{"href":"https://api.github.com/repos/kgv/rust_book_ru/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kgv/rust_book_ru/pulls/76/commits"},"statuses":{"href":"https://api.github.com/repos/kgv/rust_book_ru/statuses/43d6fad2220193bd78bf35e7d6645d28ee0b8b50"}}}}