From 0fe2722f5c32c90c67b72f9e518a149990de2e38 Mon Sep 17 00:00:00 2001 From: Andriy Redko Date: Sun, 29 Sep 2024 02:11:16 -0400 Subject: [PATCH] uk: Refresh translations (#2375) uk: Refresh translations ``` mdbook build msgmerge --update po/uk.po book/xgettext/messages.pot ``` Signed-off-by: Andriy Redko --- po/uk.po | 1855 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 1084 insertions(+), 771 deletions(-) diff --git a/po/uk.po b/po/uk.po index 7f8ae285927..17b8b210ac2 100644 --- a/po/uk.po +++ b/po/uk.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: Comprehensive Rust 🦀\n" -"POT-Creation-Date: 2024-06-27T18:39:25-04:00\n" +"POT-Creation-Date: 2024-09-21T12:49:47-04:00\n" "PO-Revision-Date: 2023-10-18 20:05+0300\n" "Last-Translator: Oleksandr Leoshko \n" "Language-Team: \n" @@ -197,9 +197,9 @@ msgstr "Спільні посилання" msgid "Exclusive References" msgstr "Ексклюзивні посилання" -#: src/SUMMARY.md -msgid "Slices: `&[T]`" -msgstr "Зрізи: `&[T]`" +#: src/SUMMARY.md src/references/slices.md:5 +msgid "Slices" +msgstr "Зрізи" #: src/SUMMARY.md src/references/strings.md:9 msgid "Strings" @@ -226,14 +226,14 @@ msgstr "Кортежні структури" msgid "Enums" msgstr "Перелічувані типи" -#: src/SUMMARY.md -msgid "Static" -msgstr "Статика" - #: src/SUMMARY.md msgid "Const" msgstr "Константи" +#: src/SUMMARY.md +msgid "Static" +msgstr "Статика" + #: src/SUMMARY.md src/user-defined-types/aliases.md:5 msgid "Type Aliases" msgstr "Псевдоніми типу" @@ -609,9 +609,13 @@ msgstr "Перетворення спроб" msgid "`Error` Trait" msgstr "`Error` трейт" -#: src/SUMMARY.md src/error-handling/thiserror-and-anyhow.md:5 -msgid "`thiserror` and `anyhow`" -msgstr "`thiserror` та `anyhow`" +#: src/SUMMARY.md src/error-handling/thiserror.md:5 +msgid "`thiserror`" +msgstr "`thiserror`" + +#: src/SUMMARY.md src/error-handling/anyhow.md:5 +msgid "`anyhow`" +msgstr "`anyhow`" #: src/SUMMARY.md msgid "Exercise: Rewriting with `Result`" @@ -1253,7 +1257,7 @@ msgid "Cancellation" msgstr "Скасування" #: src/SUMMARY.md src/concurrency/async-exercises/chat-app.md:5 -#: src/concurrency/async-exercises/solutions.md:106 +#: src/concurrency/async-exercises/solutions.md:92 msgid "Broadcast Chat Application" msgstr "Програма широкомовного чату" @@ -1291,12 +1295,12 @@ msgid "" msgstr "" "[![Робочий процес створення](https://img.shields.io/github/actions/workflow/" "status/google/comprehensive-rust/build.yml?style=flat-square)](https://" -"github.com/google/comprehensive-rust/actions/workflows/build.yml?" -"query=branch%3Amain) [![Учасники GitHub](https://img.shields.io/github/" -"contributors/google/comprehensive-rust?style=flat-square)](https://github." -"com/google/comprehensive-rust/graphs/contributors) [![зірки GitHub](https://" -"img.shields.io/github/stars/google/comprehensive-rust?style=flat-square)]" -"(https://github.com/google/comprehensive-rust/stargazers)" +"github.com/google/comprehensive-rust/actions/workflows/build.yml?query=branch" +"%3Amain) [![Учасники GitHub](https://img.shields.io/github/contributors/" +"google/comprehensive-rust?style=flat-square)](https://github.com/google/" +"comprehensive-rust/graphs/contributors) [![зірки GitHub](https://img.shields." +"io/github/stars/google/comprehensive-rust?style=flat-square)](https://github." +"com/google/comprehensive-rust/stargazers)" #: src/index.md msgid "" @@ -1394,13 +1398,13 @@ msgstr "" #: src/index.md msgid "" -"[Concurrency](concurrency.md): a whole-day class on concurrency in Rust. We " -"cover both classical concurrency (preemptively scheduling using threads and " -"mutexes) and async/await concurrency (cooperative multitasking using " -"futures)." +"[Concurrency](concurrency/welcome.md): a whole-day class on concurrency in " +"Rust. We cover both classical concurrency (preemptively scheduling using " +"threads and mutexes) and async/await concurrency (cooperative multitasking " +"using futures)." msgstr "" -"[Concurrency](concurrency.md): повний день занять з вивчення конкурентності " -"у Rust. Ми розглянемо як класичну конкурентність (витіснюючи " +"[Concurrency](concurrency/welcome.md): повний день занять з вивчення " +"конкурентності у Rust. Ми розглянемо як класичну конкурентність (витіснююча " "багатозадачність з використанням потоків і м'ютексів), так і async/await " "конкурентність (кооперативна багатозадачність з використанням futures)." @@ -1433,8 +1437,8 @@ msgstr "Припущення" #: src/index.md msgid "" "The course assumes that you already know how to program. Rust is a " -"statically-typed language and we will sometimes make comparisons with C and " -"C++ to better explain or contrast the Rust approach." +"statically-typed language and we will sometimes make comparisons with C and C" +"++ to better explain or contrast the Rust approach." msgstr "" "Передбачається, що ви вже можете програмувати. Rust це статично типізована " "мова, і іноді ми порівнюватимемо і зіставлятимемо її з C та C++, щоб краще " @@ -1492,8 +1496,8 @@ msgid "" "Make yourself familiar with the course material. We've included speaker " "notes to help highlight the key points (please help us by contributing more " "speaker notes!). When presenting, you should make sure to open the speaker " -"notes in a popup (click the link with a little arrow next to \"Speaker " -"Notes\"). This way you have a clean screen to present to the class." +"notes in a popup (click the link with a little arrow next to \"Speaker Notes" +"\"). This way you have a clean screen to present to the class." msgstr "" "Ознайомитись з матеріалами курсу. Ми додали нотатки для викладача на деяких " "сторінках, щоб виділити ключові моменти (будь ласка, допомагайте нам, " @@ -1714,11 +1718,11 @@ msgstr "Конкурентність в Rust" #: src/running-the-course/course-structure.md:59 msgid "" -"The [Concurrency in Rust](../concurrency.md) deep dive is a full day class " -"on classical as well as `async`/`await` concurrency." +"The [Concurrency in Rust](../concurrency/welcome.md) deep dive is a full day " +"class on classical as well as `async`/`await` concurrency." msgstr "" -"[Конкурентність в Rust](../concurrency.md) це цілий день занять з класичної, " -"а також `async`/`await` конкурентності." +"[Конкурентність в Rust](../concurrency/welcome.md) це цілий день занять з " +"класичної, а також `async`/`await` конкурентності." #: src/running-the-course/course-structure.md:62 msgid "" @@ -1817,6 +1821,18 @@ msgstr "" #: src/running-the-course/translations.md:12 msgid "" +"[Japanese](https://google.github.io/comprehensive-rust/ja/) by [@CoinEZ-JPN]" +"(https://github.com/CoinEZ), [@momotaro1105](https://github.com/" +"momotaro1105), [@HidenoriKobayashi](https://github.com/HidenoriKobayashi) " +"and [@kantasv](https://github.com/kantasv)." +msgstr "" +"[Японьска](https://google.github.io/comprehensive-rust/ja/) від [@CoinEZ-JPN]" +"(https://github.com/CoinEZ), [@momotaro1105](https://github.com/" +"momotaro1105), [@HidenoriKobayashi](https://github.com/HidenoriKobayashi) і " +"[@kantasv](https://github.com/kantasv)." + +#: src/running-the-course/translations.md:14 +msgid "" "[Korean](https://google.github.io/comprehensive-rust/ko/) by [@keispace]" "(https://github.com/keispace), [@jiyongp](https://github.com/jiyongp), " "[@jooyunghan](https://github.com/jooyunghan), and [@namhyung](https://github." @@ -1827,7 +1843,7 @@ msgstr "" "[@jooyunghan](https://github.com/jooyunghan) та [@namhyung](https://github." "com/namhyung)." -#: src/running-the-course/translations.md:13 +#: src/running-the-course/translations.md:15 msgid "" "[Spanish](https://google.github.io/comprehensive-rust/es/) by [@deavid]" "(https://github.com/deavid)." @@ -1835,18 +1851,28 @@ msgstr "" "[Іспанська](https://google.github.io/comprehensive-rust/es) від [@deavid]" "(https://github.com/deavid)." -#: src/running-the-course/translations.md:15 +#: src/running-the-course/translations.md:16 +msgid "" +"[Ukrainian](https://google.github.io/comprehensive-rust/uk/) by [@git-user-" +"cpp](https://github.com/git-user-cpp), [@yaremam](https://github.com/" +"yaremam) and [@reta](https://github.com/reta)." +msgstr "" +"[Українська](https://google.github.io/comprehensive-rust/uk/) від [@git-user-" +"cpp](https://github.com/git-user-cpp), [@yaremam](https://github.com/" +"yaremam) і [@reta](https://github.com/reta)." + +#: src/running-the-course/translations.md:18 msgid "" "Use the language picker in the top-right corner to switch between languages." msgstr "" "Використовуйте кнопку вибору мови у верхньому правому куті для перемикання " "між мовами." -#: src/running-the-course/translations.md:17 +#: src/running-the-course/translations.md:20 msgid "Incomplete Translations" msgstr "Незавершені переклади" -#: src/running-the-course/translations.md:19 +#: src/running-the-course/translations.md:22 msgid "" "There is a large number of in-progress translations. We link to the most " "recently updated translations:" @@ -1854,7 +1880,15 @@ msgstr "" "Існує велика кількість незавершених перекладів. Ми посилаємося на останні " "оновлені переклади:" -#: src/running-the-course/translations.md:22 +#: src/running-the-course/translations.md:25 +msgid "" +"[Arabic](https://google.github.io/comprehensive-rust/ar/) by [@younies]" +"(https://github.com/younies)" +msgstr "" +"[Арабська](https://google.github.io/comprehensive-rust/ar/) від [@younies]" +"(https://github.com/younies)." + +#: src/running-the-course/translations.md:26 msgid "" "[Bengali](https://google.github.io/comprehensive-rust/bn/) by [@raselmandol]" "(https://github.com/raselmandol)." @@ -1862,7 +1896,21 @@ msgstr "" "[Бенгальська](https://google.github.io/comprehensive-rust/bn) від " "[@raselmandol](https://github.com/raselmandol)." -#: src/running-the-course/translations.md:23 +#: src/running-the-course/translations.md:27 +msgid "" +"[Farsi](https://google.github.io/comprehensive-rust/fa/) by [@Alix1383]" +"(https://github.com/alix1383), [@DannyRavi](https://github.com/DannyRavi), " +"[@hamidrezakp](https://github.com/hamidrezakp), [@javad-jafari](https://" +"github.com/javad-jafari) and [@moaminsharifi](https://github.com/" +"moaminsharifi)." +msgstr "" +"[Фарсі](https://google.github.io/comprehensive-rust/fa/) від [@Alix1383]" +"(https://github.com/alix1383), [@DannyRavi](https://github.com/DannyRavi), " +"[@hamidrezakp](https://github.com/hamidrezakp), [@javad-jafari](https://" +"github.com/javad-jafari) і [@moaminsharifi](https://github.com/" +"moaminsharifi)." + +#: src/running-the-course/translations.md:29 msgid "" "[French](https://google.github.io/comprehensive-rust/fr/) by [@KookaS]" "(https://github.com/KookaS), [@vcaen](https://github.com/vcaen) and " @@ -1872,7 +1920,7 @@ msgstr "" "(https://github.com/KookaS), [@vcaen](https://github.com/vcaen) і " "[@AdrienBaudemont](https://github.com/AdrienBaudemont)." -#: src/running-the-course/translations.md:24 +#: src/running-the-course/translations.md:30 msgid "" "[German](https://google.github.io/comprehensive-rust/de/) by [@Throvn]" "(https://github.com/Throvn) and [@ronaldfw](https://github.com/ronaldfw)." @@ -1880,17 +1928,7 @@ msgstr "" "[Німецька](https://google.github.io/comprehensive-rust/de/) від [@Throvn]" "(https://github.com/Throvn) і [@ronaldfw](https://github.com/ronaldfw)." -#: src/running-the-course/translations.md:25 -msgid "" -"[Japanese](https://google.github.io/comprehensive-rust/ja/) by [@CoinEZ-JPN]" -"(https://github.com/CoinEZ) and [@momotaro1105](https://github.com/" -"momotaro1105)." -msgstr "" -"[Японьска](https://google.github.io/comprehensive-rust/ja/) від [@CoinEZ-JPN]" -"(https://github.com/CoinEZ) і [@momotaro1105](https://github.com/" -"momotaro1105)." - -#: src/running-the-course/translations.md:26 +#: src/running-the-course/translations.md:31 msgid "" "[Italian](https://google.github.io/comprehensive-rust/it/) by " "[@henrythebuilder](https://github.com/henrythebuilder) and [@detro](https://" @@ -1900,7 +1938,19 @@ msgstr "" "[@henrythebuilder](https://github.com/henrythebuilder) і [@detro](https://" "github.com/detro)." -#: src/running-the-course/translations.md:28 +#: src/running-the-course/translations.md:33 +msgid "" +"The full list of translations with their current status is also available " +"either [as of their last update](https://google.github.io/comprehensive-rust/" +"translation-report.html) or [synced to the latest version of the course]" +"(https://google.github.io/comprehensive-rust/synced-translation-report.html)." +msgstr "" +"Повний список перекладів з їхнім поточним статусом також доступний або [на " +"момент останнього оновлення](https://google.github.io/comprehensive-rust/" +"translation-report.html), або [синхронізований з останньою версією курсу]" +"(https://google.github.io/comprehensive-rust/synced-translation-report.html)." + +#: src/running-the-course/translations.md:37 msgid "" "If you want to help with this effort, please see [our instructions](https://" "github.com/google/comprehensive-rust/blob/main/TRANSLATIONS.md) for how to " @@ -1976,6 +2026,16 @@ msgstr "" "це може призвести до встановлення застарілої версії Rust і неочікуваної " "поведінки. Використовуйте таку команду: " +#: src/cargo.md +msgid "" +"On macOS, you can use [Homebrew](https://brew.sh/) to install Rust, but this " +"may provide an outdated version. Therefore, it is recommended to install " +"Rust from the official site." +msgstr "" +"На macOS ви можете використовувати [Homebrew](https://brew.sh/) для " +"установки Rust, але він може надати застарілу версію. Тому рекомендується " +"встановлювати Rust з офіційного сайту." + #: src/cargo/rust-ecosystem.md:1 msgid "The Rust Ecosystem" msgstr "Екосистема Rust" @@ -2785,11 +2845,11 @@ msgstr "" #: src/testing/unit-tests.md:2 src/testing/other.md:2 #: src/error-handling/result.md:2 src/error-handling/try.md:2 #: src/error-handling/try-conversions.md:2 src/error-handling/error.md:2 -#: src/error-handling/thiserror-and-anyhow.md:2 src/unsafe-rust/unsafe.md:2 -#: src/unsafe-rust/mutable-static.md:2 src/unsafe-rust/unions.md:2 -#: src/unsafe-rust/unsafe-functions.md:2 src/unsafe-rust/unsafe-traits.md:2 -#: src/android/testing/googletest.md:2 src/android/testing/mocking.md:2 -#: src/concurrency/shared-state/arc.md:2 +#: src/error-handling/thiserror.md:2 src/error-handling/anyhow.md:2 +#: src/unsafe-rust/unsafe.md:2 src/unsafe-rust/mutable-static.md:2 +#: src/unsafe-rust/unions.md:2 src/unsafe-rust/unsafe-functions.md:2 +#: src/unsafe-rust/unsafe-traits.md:2 src/android/testing/googletest.md:2 +#: src/android/testing/mocking.md:2 src/concurrency/shared-state/arc.md:2 #: src/concurrency/async-control-flow/select.md:2 #: src/concurrency/async-pitfalls/async-traits.md:2 msgid "minutes: 5" @@ -3157,7 +3217,6 @@ msgstr "// Базовий випадок.\n" #: src/types-and-values/exercise.md:17 src/types-and-values/exercise.md:20 #: src/control-flow-basics/exercise.md:31 -#: src/control-flow-basics/exercise.md:35 msgid "\"Implement this\"" msgstr "\"Реалізуйте це\"" @@ -3234,13 +3293,15 @@ msgstr "" #: src/control-flow-basics/if.md:41 msgid "" -"When `if` is used in an expression, the expression must have a `;` to " -"separate it from the next statement. Remove the `;` before `println!` to see " -"the compiler error." +"An `if` expression should be used in the same way as the other expressions. " +"For example, when it is used in a `let` statement, the statement must be " +"terminated with a `;` as well. Remove the `;` before `println!` to see the " +"compiler error." msgstr "" -"Коли у виразі використовується `if`, вираз повинен мати `;`, щоб відокремити " -"його від наступного оператора. Видаліть `;` перед `println!`, щоб побачити " -"помилку компілятора." +"Вираз `if` слід використовувати так само, як і інші вирази. Наприклад, якщо " +"він використовується в операторі `let`, цей оператор також має завершуватися " +"символом `;`. Видаліть `;` перед `println!`, щоб побачити помилку " +"компілятора." #: src/control-flow-basics/loops.md:7 msgid "There are three looping keywords in Rust: `while`, `loop`, and `for`:" @@ -3318,25 +3379,38 @@ msgstr "" #: src/control-flow-basics/break-continue.md:10 msgid "" "If you want to exit any kind of loop early, use [`break`](https://doc.rust-" -"lang.org/reference/expressions/loop-expr.html#break-expressions). For " +"lang.org/reference/expressions/loop-expr.html#break-expressions). With " "`loop`, this can take an optional expression that becomes the value of the " "`loop` expression." msgstr "" "Якщо ви хочете достроково вийти з будь-якого типу циклу, використовуйте " "[`break`](https://doc.rust-lang.org/reference/expressions/loop-expr." -"html#break-expressions). Для `loop` це може бути необов'язковий вираз, який " +"html#break-expressions). З `loop` це може бути необов'язковий вираз, який " "стане значенням виразу `loop`." #: src/control-flow-basics/break-continue.md:26 src/std-traits/exercise.md:27 #: src/std-traits/solution.md:29 src/smart-pointers/trait-objects.md:98 #: src/smart-pointers/trait-objects.md:99 -#: src/borrowing/interior-mutability.md:51 src/modules/exercise.md:140 +#: src/borrowing/interior-mutability.md:29 src/modules/exercise.md:140 #: src/modules/solution.md:78 src/android/build-rules/library.md:44 #: src/android/interoperability/cpp/rust-bridge.md:17 #: src/concurrency/async-pitfalls/cancellation.md:63 msgid "\"{}\"" msgstr "\"{}\"" +#: src/control-flow-basics/break-continue.md:33 +msgid "" +"Note that `loop` is the only looping construct which can return a non-" +"trivial value. This is because it's guaranteed to only return at a `break` " +"statement (unlike `while` and `for` loops, which can also return when the " +"condition fails)." +msgstr "" +"Зверніть увагу, що `loop` - це єдина циклічна конструкція, яка може " +"повертати нетривіальне значення. Це пов'язано з тим, що вона гарантовано " +"повертає значення лише при виконанні оператора `break` (на відміну від " +"циклів `while` і `for`, які також можуть повертати значення при невиконанні " +"умови)." + #: src/control-flow-basics/break-continue/labels.md:3 msgid "" "Both `continue` and `break` can optionally take a label argument which is " @@ -3347,17 +3421,15 @@ msgstr "" #: src/control-flow-basics/break-continue/labels.md:19 msgid "\"elements searched: {elements_searched}\"" -msgstr "" +msgstr "\"елементів переглянуто: {elements_searched}\"" #: src/control-flow-basics/break-continue/labels.md:25 -msgid "" -"Note that `loop` is the only looping construct which returns a non-trivial " -"value. This is because it's guaranteed to be entered at least once (unlike " -"`while` and `for` loops)." -msgstr "" -"Зауважте, що `loop` — це єдина конструкція циклу, яка повертає нетривіальне " -"значення. Це тому, що він гарантовано буде введений принаймні один раз (на " -"відміну від циклів `while` та `for`)." +msgid "Labeled break also works on arbitrary blocks, e.g." +msgstr "Позначене переривання також працює на довільних блоках, наприклад" + +#: src/control-flow-basics/break-continue/labels.md:29 +msgid "\"This line gets skipped\"" +msgstr "\"Цей рядок пропускається\"" #: src/control-flow-basics/blocks-and-scopes.md:7 msgid "Blocks" @@ -3412,7 +3484,7 @@ msgstr "\"до: {a}\"" #: src/control-flow-basics/blocks-and-scopes/scopes.md:13 #: src/generics/exercise.md:22 src/generics/solution.md:20 -#: src/std-traits/from-and-into.md:11 src/std-traits/from-and-into.md:23 +#: src/std-traits/from-and-into.md:12 src/std-traits/from-and-into.md:24 msgid "\"hello\"" msgstr "\"привіт\"" @@ -3440,11 +3512,11 @@ msgstr "" #: src/control-flow-basics/blocks-and-scopes/scopes.md:28 msgid "" "Shadowing is different from mutation, because after shadowing both " -"variable's memory locations exist at the same time. Both are available under " +"variables' memory locations exist at the same time. Both are available under " "the same name, depending where you use it in the code." msgstr "" "Затінення відрізняється від мутації тим, що після затінення обидві ділянки " -"пам'яті змінної існують одночасно. Обидві змінні доступні під одним і тим же " +"пам'яті змінних існують одночасно. Обидві змінні доступні під одним і тим же " "ім'ям, залежно від того, де ви їх використовуєте у коді." #: src/control-flow-basics/blocks-and-scopes/scopes.md:31 @@ -3483,11 +3555,10 @@ msgstr "" #: src/control-flow-basics/functions.md:31 msgid "" "Some functions have no return value, and return the 'unit type', `()`. The " -"compiler will infer this if the `-> ()` return type is omitted." +"compiler will infer this if the return type is omitted." msgstr "" "Деякі функції не мають значення, що повертається, і повертають 'тип " -"агрегату', `()`. Компілятор визначить це, якщо тип повернення `-> ()` " -"пропущено." +"агрегату', `()`. Компілятор визначить це, якщо тип повернення пропущено." #: src/control-flow-basics/functions.md:33 msgid "" @@ -3654,6 +3725,7 @@ msgstr "" msgid "/// Determine the length of the collatz sequence beginning at `n`.\n" msgstr "/// Визначте довжину послідовності колатів, яка починається з `n`.\n" +#: src/control-flow-basics/exercise.md:40 #: src/control-flow-basics/solution.md:20 src/concurrency/threads/scoped.md:15 #: src/concurrency/threads/scoped.md:34 msgid "\"Length: {}\"" @@ -3757,12 +3829,12 @@ msgstr "" #: src/tuples-and-arrays/iteration.md:25 msgid "" "The `assert_ne!` macro is new here. There are also `assert_eq!` and `assert!" -"` macros. These are always checked while, debug-only variants like " +"` macros. These are always checked, while debug-only variants like " "`debug_assert!` compile to nothing in release builds." msgstr "" "Макрос `assert_ne!` тут новий. Існують також макроси `assert_eq!` та `assert!" -"`. Вони завжди перевіряються під час виконання, варіанти лише для " -"налагодження, такі як `debug_assert!`, не компілюються у релізних збірках." +"`. Вони завжди перевіряються, тоді як варіанти лише для налагодження, такі " +"як `debug_assert!`, не компілюються у релізних збірках." #: src/tuples-and-arrays/destructuring.md:7 msgid "" @@ -3872,14 +3944,13 @@ msgstr "\"транспонована: {:#?}\"" #: src/references/shared.md:7 msgid "" -"A reference provides a way to access another value without taking " -"responsibility for the value, and is also called \"borrowing\". Shared " -"references are read-only, and the referenced data cannot change." +"A reference provides a way to access another value without taking ownership " +"of the value, and is also called \"borrowing\". Shared references are read-" +"only, and the referenced data cannot change." msgstr "" -"Посилання дає змогу отримати доступ до іншого значення, не беручи на себе " -"відповідальність за це значення, і також називається \"запозиченням\". " -"Спільні посилання доступні лише для читання, і дані, на які вони " -"посилаються, не можуть бути змінені." +"Посилання забезпечує доступ до іншого значення без отримання права власності " +"на нього, і також називається \"запозиченням\". Спільні посилання доступні " +"лише для читання, і дані, на які вони посилаються, не можуть бути змінені." #: src/references/shared.md:24 msgid "" @@ -3897,6 +3968,13 @@ msgstr "Rust статично забороняє висячі посилання #: src/references/shared.md:41 msgid "" +"References can never be null in Rust, so null checking is not necessary." +msgstr "" +"Посилання ніколи не можуть бути null у Rust, тому перевірка на null не є " +"обов'язковою." + +#: src/references/shared.md:43 +msgid "" "A reference is said to \"borrow\" the value it refers to, and this is a good " "model for students not familiar with pointers: code can use the reference to " "access the value, but is still \"owned\" by the original variable. The " @@ -3908,7 +3986,7 @@ msgstr "" "\"власністю\" вихідної змінної. Більш детально про володіння буде розглянуто " "на третьому дні курсу." -#: src/references/shared.md:46 +#: src/references/shared.md:48 msgid "" "References are implemented as pointers, and a key advantage is that they can " "be much smaller than the thing they point to. Students familiar with C or C+" @@ -3922,24 +4000,24 @@ msgstr "" "частинах курсу буде розглянуто, як Rust запобігає помилкам, пов'язаним з " "безпекою пам'яті, які виникають при використанні сирих вказівників." -#: src/references/shared.md:51 +#: src/references/shared.md:53 msgid "" "Rust does not automatically create references for you - the `&` is always " "required." msgstr "" "Rust не створює посилання автоматично - завжди потрібно використовувати `&`." -#: src/references/shared.md:54 +#: src/references/shared.md:56 msgid "" "Rust will auto-dereference in some cases, in particular when invoking " -"methods (try `r.is_ascii()`). There is no need for an `->` operator like in " -"C++." +"methods (try `r.is_ascii()`). There is no need for an `->` operator like in C" +"++." msgstr "" "У деяких випадках Rust виконує автоматичне розіменування, зокрема під час " "виклику методів (спробуйте `r.is_ascii()`). Тут не потрібен оператор `->`, " "як у C++." -#: src/references/shared.md:57 +#: src/references/shared.md:59 msgid "" "In this example, `r` is mutable so that it can be reassigned (`r = &b`). " "Note that this re-binds `r`, so that it refers to something else. This is " @@ -3951,7 +4029,7 @@ msgstr "" "щось інше. Це відрізняється від C++, де присвоювання посилання змінює " "значення, на яке воно посилається." -#: src/references/shared.md:61 +#: src/references/shared.md:63 msgid "" "A shared reference does not allow modifying the value it refers to, even if " "that value was mutable. Try `*r = 'X'`." @@ -3959,7 +4037,7 @@ msgstr "" "Спільне посилання не дозволяє змінювати значення, на яке воно посилається, " "навіть якщо це значення було змінним. Спробуйте `*r = 'X'`." -#: src/references/shared.md:64 +#: src/references/shared.md:66 msgid "" "Rust is tracking the lifetimes of all references to ensure they live long " "enough. Dangling references cannot occur in safe Rust. `x_axis` would return " @@ -3971,7 +4049,7 @@ msgstr "" "Функція `x_axis` поверне посилання на `point`, але `point` буде звільнено, " "коли функція повернеться, тому це не буде скомпільовано." -#: src/references/shared.md:69 +#: src/references/shared.md:71 msgid "We will talk more about borrowing when we get to ownership." msgstr "Про запозичення ми поговоримо більше, коли дійдемо до володіння." @@ -4009,10 +4087,6 @@ msgstr "" "прив'язати до різних значень, тоді як другий представляє ексклюзивне " "посилання на значення, що змінюється." -#: src/references/slices.md:5 -msgid "Slices" -msgstr "Зрізи" - #: src/references/slices.md:7 msgid "A slice gives you a view into a larger collection:" msgstr "Зріз дає змогу поглянути на більшу колекцію:" @@ -4021,12 +4095,7 @@ msgstr "Зріз дає змогу поглянути на більшу коле msgid "Slices borrow data from the sliced type." msgstr "Зрізи запозичують дані зі зрізаного типу." -#: src/references/slices.md:23 -msgid "Question: What happens if you modify `a[3]` right before printing `s`?" -msgstr "" -"Запитання: що станеться, якщо змінити `a[3]` безпосередньо перед друком `s`?" - -#: src/references/slices.md:27 +#: src/references/slices.md:26 msgid "" "We create a slice by borrowing `a` and specifying the starting and ending " "indexes in brackets." @@ -4034,7 +4103,7 @@ msgstr "" "Ми створюємо зріз, запозичуючи `a` та вказуючи початковий і кінцевий індекси " "в дужках." -#: src/references/slices.md:30 +#: src/references/slices.md:29 msgid "" "If the slice starts at index 0, Rust’s range syntax allows us to drop the " "starting index, meaning that `&a[0..a.len()]` and `&a[..a.len()]` are " @@ -4044,7 +4113,7 @@ msgstr "" "відкинути початковий індекс, тобто `&a[0..a.len()]` і `&a[..a.len()]` " "ідентичні." -#: src/references/slices.md:34 +#: src/references/slices.md:33 msgid "" "The same is true for the last index, so `&a[2..a.len()]` and `&a[2..]` are " "identical." @@ -4052,13 +4121,13 @@ msgstr "" "Теж саме стосується останнього індексу, тому `&a[2..a.len()]` і `&a[2..]` " "ідентичні." -#: src/references/slices.md:37 +#: src/references/slices.md:36 msgid "" "To easily create a slice of the full array, we can therefore use `&a[..]`." msgstr "" "Щоб легко створити повний зріз масиву, ми можемо використовувати `&a[..]`." -#: src/references/slices.md:39 +#: src/references/slices.md:38 msgid "" "`s` is a reference to a slice of `i32`s. Notice that the type of `s` " "(`&[i32]`) no longer mentions the array length. This allows us to perform " @@ -4068,7 +4137,7 @@ msgstr "" "не згадує довжину масиву. Це дозволяє нам виконувати обчислення на зрізах " "різного розміру." -#: src/references/slices.md:43 +#: src/references/slices.md:42 msgid "" "Slices always borrow from another object. In this example, `a` has to remain " "'alive' (in scope) for at least as long as our slice." @@ -4077,20 +4146,6 @@ msgstr "" "залишатися 'живим' (в області застосування) принаймні стільки ж, скільки і " "наш зріз." -#: src/references/slices.md:46 -msgid "" -"The question about modifying `a[3]` can spark an interesting discussion, but " -"the answer is that for memory safety reasons you cannot do it through `a` at " -"this point in the execution, but you can read the data from both `a` and `s` " -"safely. It works before you created the slice, and again after the " -"`println`, when the slice is no longer used." -msgstr "" -"Питання про модифікацію `a[3]` може викликати цікаву дискусію, але відповідь " -"полягає в тому, що з міркувань безпеки пам’яті ви не можете зробити це через " -"`a` на цьому етапі виконання, але ви можете читати дані з обох `a ` і `s` " -"безпечно. Це спрацьовує до того, як ви створили зріз, і знову після " -"`println`, коли зріз більше не використовується." - #: src/references/strings.md:11 msgid "We can now understand the two string types in Rust:" msgstr "Тепер ми можемо зрозуміти два типи рядків у Rust:" @@ -4128,12 +4183,12 @@ msgstr "\"s3: {s3}\"" #: src/references/strings.md:36 msgid "" "`&str` introduces a string slice, which is an immutable reference to UTF-8 " -"encoded string data stored in a block of memory. String literals " -"(`\"Hello\"`), are stored in the program’s binary." +"encoded string data stored in a block of memory. String literals (`\"Hello" +"\"`), are stored in the program’s binary." msgstr "" "`&str` представляє зріз рядка, який є незмінним посиланням на дані рядка в " -"кодуванні UTF-8, що зберігаються в блоці пам’яті. Рядкові літерали " -"(`\"Hello\"`) зберігаються у бінарному файлі програми." +"кодуванні UTF-8, що зберігаються в блоці пам’яті. Рядкові літерали (`\"Hello" +"\"`) зберігаються у бінарному файлі програми." #: src/references/strings.md:40 msgid "" @@ -4195,9 +4250,9 @@ msgstr "" #: src/references/strings.md:70 msgid "" -"Raw strings allow you to create a `&str` value with escapes disabled: " -"`r\"\\n\" == \"\\\\n\"`. You can embed double-quotes by using an equal " -"amount of `#` on either side of the quotes:" +"Raw strings allow you to create a `&str` value with escapes disabled: `r\"\\n" +"\" == \"\\\\n\"`. You can embed double-quotes by using an equal amount of " +"`#` on either side of the quotes:" msgstr "" "Необроблені рядки дозволяють створювати значення `&str` з відключеним " "екрануванням: `r\"\\n\" == \"\\\\n\"`. Ви можете вставити подвійні лапки, " @@ -4497,9 +4552,9 @@ msgstr "Якщо потрібно, він зберігає ціле число #: src/user-defined-types/enums.md:48 msgid "" "If the allowed variant values do not cover all bit patterns, it will use " -"invalid bit patterns to encode the discriminant (the \"niche " -"optimization\"). For example, `Option<&u8>` stores either a pointer to an " -"integer or `NULL` for the `None` variant." +"invalid bit patterns to encode the discriminant (the \"niche optimization" +"\"). For example, `Option<&u8>` stores either a pointer to an integer or " +"`NULL` for the `None` variant." msgstr "" "Якщо допустимі значення варіантів не покривають усіх бітових шаблонів, для " "кодування дискримінанта буде використано неприпустимі бітові шаблони " @@ -4521,8 +4576,9 @@ msgstr "" #: src/user-defined-types/enums.md:73 src/user-defined-types/static.md:30 #: src/memory-management/review.md:54 src/memory-management/move.md:103 -#: src/memory-management/copy-types.md:60 src/smart-pointers/box.md:88 +#: src/memory-management/copy-types.md:60 src/smart-pointers/box.md:89 #: src/borrowing/shared.md:36 src/error-handling/result.md:49 +#: src/error-handling/anyhow.md:59 msgid "More to Explore" msgstr "Більше інформації для вивчення" @@ -4554,6 +4610,47 @@ msgstr "" "представлення на практиці. Важливо зазначити, що компілятор не надає жодних " "гарантій щодо цього представлення, тому це абсолютно небезпечно." +#: src/user-defined-types/const.md:1 +msgid "`const`" +msgstr "`const`" + +#: src/user-defined-types/const.md:3 +msgid "" +"Constants are evaluated at compile time and their values are inlined " +"wherever they are used:" +msgstr "" +"Константи обчислюються під час компіляції, а їхні значення вставляються " +"всюди, де вони використовуються:" + +#: src/user-defined-types/const.md:26 +msgid "" +"According to the [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-" +"vs-static.html) these are inlined upon use." +msgstr "" +"Відповідно до [Книги Rust RFC](https://rust-lang.github.io/rfcs/0246-const-" +"vs-static.html) вони підставляються під час використання." + +#: src/user-defined-types/const.md:28 +msgid "" +"Only functions marked `const` can be called at compile time to generate " +"`const` values. `const` functions can however be called at runtime." +msgstr "" +"Лише функції з позначкою `const` можна викликати під час компіляції для " +"створення значень `const`. Однак функції `const` можна викликати під час " +"виконання." + +#: src/user-defined-types/const.md:33 +msgid "Mention that `const` behaves semantically similar to C++'s `constexpr`" +msgstr "Зауважте, що `const` поводиться семантично подібно до `constexpr` C++." + +#: src/user-defined-types/const.md:34 +msgid "" +"It isn't super common that one would need a runtime evaluated constant, but " +"it is helpful and safer than using a static." +msgstr "" +"Не так часто виникає потреба у константі, що обчислюється під час виконання, " +"але це корисно та безпечніше, ніж використовувати static." + #: src/user-defined-types/static.md:5 msgid "`static`" msgstr "`static`" @@ -4617,47 +4714,6 @@ msgid "Thread-local data can be created with the macro `std::thread_local`." msgstr "" "Локальні дані потоку можна створити за допомогою макросу `std::thread_local`." -#: src/user-defined-types/const.md:1 -msgid "`const`" -msgstr "`const`" - -#: src/user-defined-types/const.md:3 -msgid "" -"Constants are evaluated at compile time and their values are inlined " -"wherever they are used:" -msgstr "" -"Константи обчислюються під час компіляції, а їхні значення вставляються " -"всюди, де вони використовуються:" - -#: src/user-defined-types/const.md:26 -msgid "" -"According to the [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-" -"vs-static.html) these are inlined upon use." -msgstr "" -"Відповідно до [Книги Rust RFC](https://rust-lang.github.io/rfcs/0246-const-" -"vs-static.html) вони підставляються під час використання." - -#: src/user-defined-types/const.md:28 -msgid "" -"Only functions marked `const` can be called at compile time to generate " -"`const` values. `const` functions can however be called at runtime." -msgstr "" -"Лише функції з позначкою `const` можна викликати під час компіляції для " -"створення значень `const`. Однак функції `const` можна викликати під час " -"виконання." - -#: src/user-defined-types/const.md:33 -msgid "Mention that `const` behaves semantically similar to C++'s `constexpr`" -msgstr "Зауважте, що `const` поводиться семантично подібно до `constexpr` C++." - -#: src/user-defined-types/const.md:34 -msgid "" -"It isn't super common that one would need a runtime evaluated constant, but " -"it is helpful and safer than using a static." -msgstr "" -"Не так часто виникає потреба у константі, що обчислюється під час виконання, " -"але це корисно та безпечніше, ніж використовувати static." - #: src/user-defined-types/aliases.md:7 msgid "" "A type alias creates a name for another type. The two types can be used " @@ -4991,6 +5047,34 @@ msgstr "" "Умова, визначена в запобіжнику, застосовується до кожного виразу в шаблоні з " "`|`." +#: src/pattern-matching/match.md:59 +msgid "More To Explore" +msgstr "Більше інформації для вивчення" + +#: src/pattern-matching/match.md:61 +msgid "" +"Another piece of pattern syntax you can show students is the `@` syntax " +"which binds a part of a pattern to a variable. For example:" +msgstr "" +"Ще одним елементом синтаксису шаблону, який ви можете показати учням, є " +"синтаксис `@`, який прив'язує частину шаблону до змінної. Наприклад:" + +#: src/pattern-matching/match.md:68 +msgid "\"outer: {outer:?}, inner: {inner}\"" +msgstr "\"outer: {outer:?}, inner: {inner}\"" + +#: src/pattern-matching/match.md:74 +msgid "" +"In this example `inner` has the value 123 which it pulled from the `Option` " +"via destructuring, `outer` captures the entire `Some(inner)` expression, so " +"it contains the full `Option::Some(123)`. This is rarely used but can be " +"useful in more complex patterns." +msgstr "" +"У цьому прикладі `inner` має значення 123, яке він витягнув з `Option` за " +"допомогою деструктуризації, `outer` перехоплює весь вираз `Some(inner)`, " +"тому він містить повний вираз `Option::Some(123)`. Це рідко " +"використовується, але може бути корисним у більш складних шаблонах." + #: src/pattern-matching/destructuring-structs.md:5 msgid "Structs" msgstr "Структури" @@ -5102,23 +5186,6 @@ msgstr "" "на перевагу, яку надає компілятор Rust, підтверджуючи що всі випадки " "оброблено." -#: src/pattern-matching/destructuring-enums.md:50 -msgid "" -"Save the result of `divide_in_two` in the `result` variable and `match` it " -"in a loop. That won't compile because `msg` is consumed when matched. To fix " -"it, match `&result` instead of `result`. That will make `msg` a reference so " -"it won't be consumed. This [\"match ergonomics\"](https://rust-lang.github." -"io/rfcs/2005-match-ergonomics.html) appeared in Rust 2018. If you want to " -"support older Rust, replace `msg` with `ref msg` in the pattern." -msgstr "" -"Збережіть результат `divide_in_two` у змінній `result` і `match` його у " -"циклі. Це не буде скомпільовано, оскільки при порівнянні споживається `msg`. " -"Щоб виправити це, порівняйте `&result` замість `result`. Це зробить `msg` " -"посиланням, тому його не буде використано. Ця [\"ергономіка співставлення\"]" -"(https://rust-lang.github.io/rfcs/2005-match-ergonomics.html) з'явилася у " -"Rust 2018. Якщо ви хочете підтримувати попередні версії Rust, замініть `msg` " -"на `ref msg` у шаблоні." - #: src/pattern-matching/let-control-flow.md:7 msgid "" "Rust has a few control flow constructs which differ from other languages. " @@ -5167,34 +5234,34 @@ msgstr "" "flow_control/let_else.html). Випадок \"else\" повинен відрізнятися " "(`return`, `break` або паніка - що завгодно, але не випадання з кінця блоку)." -#: src/pattern-matching/let-control-flow.md:48 -#: src/pattern-matching/let-control-flow.md:110 -msgid "\"got None\"" -msgstr "\"отримав None\"" - -#: src/pattern-matching/let-control-flow.md:54 +#: src/pattern-matching/let-control-flow.md:50 #: src/pattern-matching/let-control-flow.md:114 +msgid "\"not a hex digit\"" +msgstr "\"не шістнадцяткова цифра\"" + +#: src/pattern-matching/let-control-flow.md:53 +#: src/pattern-matching/let-control-flow.md:110 msgid "\"got empty string\"" msgstr "\"отримав порожній рядок\"" -#: src/pattern-matching/let-control-flow.md:60 -#: src/pattern-matching/let-control-flow.md:118 -msgid "\"not a hex digit\"" -msgstr "\"не шістнадцяткова цифра\"" +#: src/pattern-matching/let-control-flow.md:56 +#: src/pattern-matching/let-control-flow.md:106 +msgid "\"got None\"" +msgstr "\"отримав None\"" -#: src/pattern-matching/let-control-flow.md:65 +#: src/pattern-matching/let-control-flow.md:61 #: src/pattern-matching/solution.md:113 msgid "\"result: {:?}\"" msgstr "\"результат: {:?}\"" -#: src/pattern-matching/let-control-flow.md:65 src/generics/trait-bounds.md:20 +#: src/pattern-matching/let-control-flow.md:61 src/generics/trait-bounds.md:20 #: src/smart-pointers/solution.md:87 src/smart-pointers/solution.md:90 #: src/testing/solution.md:83 src/android/testing.md #: src/android/testing/googletest.md:15 src/android/testing/googletest.md:16 msgid "\"foo\"" msgstr "\"foo\"" -#: src/pattern-matching/let-control-flow.md:69 +#: src/pattern-matching/let-control-flow.md:65 msgid "" "Like with `if let`, there is a [`while let`](https://doc.rust-lang.org/" "reference/expressions/loop-expr.html#predicate-pattern-loops) variant which " @@ -5204,7 +5271,7 @@ msgstr "" "reference/expressions/loop-expr.html#predicate-pattern-loops), який " "багаторазово перевіряє значення на відповідність шаблону:" -#: src/pattern-matching/let-control-flow.md:85 +#: src/pattern-matching/let-control-flow.md:81 msgid "" "Here [`String::pop`](https://doc.rust-lang.org/stable/std/string/struct." "String.html#method.pop) returns `Some(c)` until the string is empty, after " @@ -5216,11 +5283,11 @@ msgstr "" "після чого поверне `None`. Використання `while let` дозволяє нам " "продовжувати ітерацію по всіх елементах." -#: src/pattern-matching/let-control-flow.md:92 +#: src/pattern-matching/let-control-flow.md:88 msgid "if-let" msgstr "if-let" -#: src/pattern-matching/let-control-flow.md:94 +#: src/pattern-matching/let-control-flow.md:90 msgid "" "Unlike `match`, `if let` does not have to cover all branches. This can make " "it more concise than `match`." @@ -5228,23 +5295,23 @@ msgstr "" "На відміну від `match`, `if let` не має охоплювати всі гілки. Це може " "зробити його більш лаконічним, ніж `match`." -#: src/pattern-matching/let-control-flow.md:96 +#: src/pattern-matching/let-control-flow.md:92 msgid "A common usage is handling `Some` values when working with `Option`." msgstr "" "Загальним використанням є обробка значень `Some` під час роботи з `Option`." -#: src/pattern-matching/let-control-flow.md:97 +#: src/pattern-matching/let-control-flow.md:93 msgid "" "Unlike `match`, `if let` does not support guard clauses for pattern matching." msgstr "" "На відміну від `match`, `if let` не підтримує захисні вирази для збігу " "шаблонів." -#: src/pattern-matching/let-control-flow.md:99 +#: src/pattern-matching/let-control-flow.md:95 msgid "let-else" msgstr "let-else" -#: src/pattern-matching/let-control-flow.md:101 +#: src/pattern-matching/let-control-flow.md:97 msgid "" "`if-let`s can pile up, as shown. The `let-else` construct supports " "flattening this nested code. Rewrite the awkward version for students, so " @@ -5254,15 +5321,15 @@ msgstr "" "згладжування цього вкладеного коду. Перепишіть незручну версію для " "студентів, щоб вони могли побачити перетворення." -#: src/pattern-matching/let-control-flow.md:105 +#: src/pattern-matching/let-control-flow.md:101 msgid "The rewritten version is:" msgstr "Переписана версія така:" -#: src/pattern-matching/let-control-flow.md:125 +#: src/pattern-matching/let-control-flow.md:121 msgid "while-let" msgstr "while-let" -#: src/pattern-matching/let-control-flow.md:127 +#: src/pattern-matching/let-control-flow.md:123 msgid "" "Point out that the `while let` loop will keep going as long as the value " "matches the pattern." @@ -5270,7 +5337,7 @@ msgstr "" "Зверніть увагу, що цикл `while let` триватиме, доки значення відповідає " "шаблону." -#: src/pattern-matching/let-control-flow.md:129 +#: src/pattern-matching/let-control-flow.md:125 msgid "" "You could rewrite the `while let` loop as an infinite loop with an if " "statement that breaks when there is no value to unwrap for `name.pop()`. The " @@ -5618,7 +5685,6 @@ msgstr "" "`Pet`, повинен реалізувати `Animal`." #: src/methods-and-traits/traits/supertraits.md:30 -#: src/concurrency/async-control-flow/select.md:48 msgid "\"Rex\"" msgstr "\"Рекс\"" @@ -5750,27 +5816,27 @@ msgstr "" "самий трейт, додаючи поведінку в процесі. Які ще типи обгорток можуть бути " "корисними у утиліті для ведення логів?" -#: src/methods-and-traits/exercise.md:24 src/methods-and-traits/solution.md:7 +#: src/methods-and-traits/exercise.md:22 src/methods-and-traits/solution.md:5 msgid "/// Log a message at the given verbosity level.\n" msgstr "/// Запишіть повідомлення із заданим рівнем докладності.\n" -#: src/methods-and-traits/exercise.md:32 src/methods-and-traits/solution.md:15 +#: src/methods-and-traits/exercise.md:30 src/methods-and-traits/solution.md:13 msgid "\"verbosity={verbosity}: {message}\"" msgstr "\"verbosity={verbosity}: {message}\"" -#: src/methods-and-traits/exercise.md:37 src/methods-and-traits/solution.md:20 +#: src/methods-and-traits/exercise.md:33 +msgid "// TODO: Define and implement `VerbosityFilter`.\n" +msgstr "// TODO: Визначте та реалізуйте `VerbosityFilter`.\n" + +#: src/methods-and-traits/exercise.md:38 src/methods-and-traits/solution.md:33 msgid "\"FYI\"" msgstr "\"FYI\"" -#: src/methods-and-traits/exercise.md:38 src/methods-and-traits/solution.md:21 +#: src/methods-and-traits/exercise.md:39 src/methods-and-traits/solution.md:34 msgid "\"Uhoh\"" msgstr "\"Uhoh\"" -#: src/methods-and-traits/exercise.md:40 -msgid "// TODO: Define and implement `VerbosityFilter`.\n" -msgstr "// TODO: Визначте та реалізуйте `VerbosityFilter`.\n" - -#: src/methods-and-traits/solution.md:23 +#: src/methods-and-traits/solution.md:16 msgid "/// Only log messages up to the given verbosity level.\n" msgstr "/// Записуйте повідомлення лише до заданого рівня докладності.\n" @@ -5796,8 +5862,8 @@ msgid "\"picked a number: {:?}\"" msgstr "\"вибраний номер: {:?}\"" #: src/generics/generic-functions.md:22 -msgid "\"picked a tuple: {:?}\"" -msgstr "\"вибраний кортеж: {:?}\"" +msgid "\"picked a string: {:?}\"" +msgstr "\"вибрав рядок: {:?}\"" #: src/generics/generic-functions.md:22 msgid "\"dog\"" @@ -5817,6 +5883,15 @@ msgstr "" #: src/generics/generic-functions.md:30 msgid "" +"In this example we only use the primitive types `i32` and `&str` for `T`, " +"but we can use any type here, including user-defined types:" +msgstr "" +"У цьому прикладі ми використовуємо лише примітивні типи `i32` та `&str` для " +"`T`, але ми можемо використовувати будь-який тип, включаючи типи, визначені " +"користувачем:" + +#: src/generics/generic-functions.md:41 +msgid "" "This is similar to C++ templates, but Rust partially compiles the generic " "function immediately, so that function must be valid for all types matching " "the constraints. For example, try modifying `pick` to return `even + odd` if " @@ -5830,7 +5905,7 @@ msgstr "" "`pick` з цілими числами, Rust все одно вважатиме його невірним. C++ " "дозволить вам зробити це." -#: src/generics/generic-functions.md:36 +#: src/generics/generic-functions.md:47 msgid "" "Generic code is turned into non-generic code based on the call sites. This " "is a zero-cost abstraction: you get exactly the same result as if you had " @@ -5970,8 +6045,8 @@ msgstr "" "деякий трейт, щоб ви могли викликати методи цього трейту." #: src/generics/trait-bounds.md:10 -msgid "You can do this with `T: Trait` or `impl Trait`:" -msgstr "Ви можете зробити це за допомогою `T: Trait` або `impl Trait`:" +msgid "You can do this with `T: Trait`:" +msgstr "Ви можете зробити це за допомогою `T: Trait`:" #: src/generics/trait-bounds.md:16 msgid "// struct NotClonable;\n" @@ -6451,32 +6526,30 @@ msgstr "Result" #: src/std-types/result.md:7 msgid "" "`Result` is similar to `Option`, but indicates the success or failure of an " -"operation, each with a different type. This is similar to the `Res` defined " -"in the expression exercise, but generic: `Result` where `T` is used in " -"the `Ok` variant and `E` appears in the `Err` variant." +"operation, each with a different enum variant. It is generic: `Result` " +"where `T` is used in the `Ok` variant and `E` appears in the `Err` variant." msgstr "" -"`Result` подібний до `Option`, але вказує на успіх або невдачу операції, " -"кожен з яких має свій тип. Він подібний до `Res`, визначеного у вправі з " -"виразами, але є узагальненим: `Result`, де `T` використовується у " -"варіанті `Ok`, а `E` з'являється у варіанті `Err`." +"`Result` схожий на `Option`, але вказує на успіх або невдачу операції, кожен " +"з яких має свій варіант переліку. Він має вигляд: `Result`, де `T` " +"використовується у варіанті `Ok`, а `E` з'являється у варіанті `Err`." -#: src/std-types/result.md:17 src/error-handling/result.md:15 +#: src/std-types/result.md:16 src/error-handling/result.md:15 msgid "\"diary.txt\"" msgstr "\"diary.txt\"" -#: src/std-types/result.md:22 src/error-handling/result.md:20 +#: src/std-types/result.md:21 src/error-handling/result.md:20 msgid "\"Dear diary: {contents} ({bytes} bytes)\"" msgstr "\"Дорогий щоденник: {contents} ({bytes} байтів)\"" -#: src/std-types/result.md:24 src/error-handling/result.md:22 +#: src/std-types/result.md:23 src/error-handling/result.md:22 msgid "\"Could not read file content\"" msgstr "\"Не вдалося прочитати вміст файлу\"" -#: src/std-types/result.md:28 src/error-handling/result.md:26 +#: src/std-types/result.md:27 src/error-handling/result.md:26 msgid "\"The diary could not be opened: {err}\"" msgstr "\"Щоденник не вдалося відкрити: {err}\"" -#: src/std-types/result.md:36 +#: src/std-types/result.md:35 msgid "" "As with `Option`, the successful value sits inside of `Result`, forcing the " "developer to explicitly extract it. This encourages error checking. In the " @@ -6488,7 +6561,7 @@ msgstr "" "випадку, коли помилка взагалі не очикуєтся, можна викликати `unwrap()` або " "`expect()`, і це також є сигналом про наміри розробника." -#: src/std-types/result.md:40 +#: src/std-types/result.md:39 msgid "" "`Result` documentation is a recommended read. Not during the course, but it " "is worth mentioning. It contains a lot of convenience methods and functions " @@ -6498,7 +6571,7 @@ msgstr "" "згадати. Вона містить багато зручних методів і функцій, які допомагають " "програмувати у функціональному стилі." -#: src/std-types/result.md:43 +#: src/std-types/result.md:42 msgid "" "`Result` is the standard type to implement error handling as we will see on " "Day 4." @@ -6827,9 +6900,9 @@ msgstr "На відміну від `vec!`, на жаль, немає станд #: src/std-types/hashmap.md:58 msgid "" "Although, since Rust 1.56, HashMap implements [`From<[(K, V); N]>`](https://" -"doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#impl-" -"From%3C%5B(K,+V);+N%5D%3E-for-HashMap%3CK,+V,+RandomState%3E), which allows " -"us to easily initialize a hash map from a literal array:" +"doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#impl-From%3C" +"%5B(K,+V);+N%5D%3E-for-HashMap%3CK,+V,+RandomState%3E), which allows us to " +"easily initialize a hash map from a literal array:" msgstr "" "Хоча, починаючи з Rust 1.56, в HashMap реалізовано [`From<[[(K, V); N]>`]" "(https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#impl-" @@ -6844,25 +6917,7 @@ msgstr "" "Крім того, HashMap можна створити з будь-якого `Iterator`, який видає " "кортежі ключ-значення." -#: src/std-types/hashmap.md:70 -msgid "" -"We are showing `HashMap`, and avoid using `&str` as key to make " -"examples easier. Using references in collections can, of course, be done, " -"but it can lead into complications with the borrow checker." -msgstr "" -"Ми показуємо `HashMap` і уникаємо використання `&str` як ключа, " -"щоб полегшити приклади. Використання посилань у колекціях, звичайно, " -"можливо, але це може призвести до ускладнень із перевіркою запозичень." - -#: src/std-types/hashmap.md:73 -msgid "" -"Try removing `to_string()` from the example above and see if it still " -"compiles. Where do you think we might run into issues?" -msgstr "" -"Спробуйте видалити `to_string()` із прикладу вище та подивіться, чи він усе " -"ще компілюється. Як ви думаєте, де ми можемо зіткнутися з проблемами?" - -#: src/std-types/hashmap.md:76 +#: src/std-types/hashmap.md:71 msgid "" "This type has several \"method-specific\" return types, such as `std::" "collections::hash_map::Keys`. These types often appear in searches of the " @@ -7077,21 +7132,35 @@ msgstr "" "Ви можете реалізувати `Add` для двох різних типів, напр. `impl Add<(i32, " "i32)> for Point` додасть кортеж до `Point`." +#: src/std-traits/operators.md:47 +msgid "" +"The `Not` trait (`!` operator) is notable because it does not \"boolify\" " +"like the same operator in C-family languages; instead, for integer types it " +"negates each bit of the number, which arithmetically is equivalent to " +"subtracting it from -1: `!5 == -6`." +msgstr "" +"Трейт `Not` (оператор `!`) примітний тим, що він не \"буліфікується\", як " +"той самий оператор у мовах сімейства C; натомість, для цілих типів він " +"заперечує кожен біт числа, що арифметично еквівалентно відніманню від -1: `!" +"5 == -6`." + #: src/std-traits/from-and-into.md:7 msgid "" "Types implement [`From`](https://doc.rust-lang.org/std/convert/trait.From." "html) and [`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) to " -"facilitate type conversions:" +"facilitate type conversions. Unlike `as`, these traits correspond to " +"lossless, infallible conversions." msgstr "" "Типи реалізують [`From`](https://doc.rust-lang.org/std/convert/trait.From." "html) і [`Into`](https://doc.rust-lang.org/std /convert/trait.Into.html), " -"щоб полегшити перетворення типів:" +"щоб полегшити перетворення типів. На відміну від `as`, ці трейти " +"відповідають безпомилковим перетворенням без втрат." -#: src/std-traits/from-and-into.md:15 src/std-traits/from-and-into.md:27 +#: src/std-traits/from-and-into.md:16 src/std-traits/from-and-into.md:28 msgid "\"{s}, {addr}, {one}, {bigger}\"" msgstr "\"{s}, {addr}, {one}, {bigger}\"" -#: src/std-traits/from-and-into.md:19 +#: src/std-traits/from-and-into.md:20 msgid "" "[`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) is " "automatically implemented when [`From`](https://doc.rust-lang.org/std/" @@ -7101,7 +7170,7 @@ msgstr "" "автоматично, коли [`From`](https://doc.rust-lang.org/ std/convert/trait.From." "html) реалізовано:" -#: src/std-traits/from-and-into.md:33 +#: src/std-traits/from-and-into.md:34 msgid "" "That's why it is common to only implement `From`, as your type will get " "`Into` implementation too." @@ -7109,7 +7178,7 @@ msgstr "" "Ось чому прийнято реалізовувати лише `From`, оскільки ваш тип також отримає " "реалізацію `Into`." -#: src/std-traits/from-and-into.md:35 +#: src/std-traits/from-and-into.md:36 msgid "" "When declaring a function argument input type like \"anything that can be " "converted into a `String`\", the rule is opposite, you should use `Into`. " @@ -7268,8 +7337,8 @@ msgstr "\"Y встановлено!\"" msgid "\"{almost_default_struct:#?}\"" msgstr "\"{almost_default_struct:#?}\"" -#: src/std-traits/default.md:35 src/lifetimes/exercise.md:201 -#: src/lifetimes/solution.md:196 +#: src/std-traits/default.md:35 src/lifetimes/exercise.md:191 +#: src/lifetimes/solution.md:183 msgid "\"{:#?}\"" msgstr "\"{:#?}\"" @@ -7336,48 +7405,51 @@ msgstr "" "[`FnOnce`](https://doc.rust-lang.org/std/ops/trait.FnOnce.html) трейти:" #: src/std-traits/closures.md:14 -msgid "\"Calling function on {input}\"" -msgstr "\"Виклик функції на {input}\"" +msgid "\"Calling {func_name}({input}): {}\"" +msgstr "\"Викликаємо {func_name}({input}): {}\"" #: src/std-traits/closures.md:20 src/std-traits/closures.md:21 -msgid "\"add_3: {}\"" -msgstr "\"add_3: {}\"" +msgid "\"add_3\"" +msgstr "\"add_3\"" #: src/std-traits/closures.md:28 src/std-traits/closures.md:29 -msgid "\"accumulate: {}\"" -msgstr "\"accumulate: {}\"" +msgid "\"accumulate\"" +msgstr "\"accumulate\"" #: src/std-traits/closures.md:32 -msgid "\"multiply_sum: {}\"" -msgstr "\"multiply_sum: {}\"" +msgid "\"multiply_sum\"" +msgstr "\"multiply_sum\"" #: src/std-traits/closures.md:38 msgid "" -"An `Fn` (e.g. `add_3`) neither consumes nor mutates captured values, or " -"perhaps captures nothing at all. It can be called multiple times " -"concurrently." +"An `Fn` (e.g. `add_3`) neither consumes nor mutates captured values. It can " +"be called needing only a shared reference to the closure, which means the " +"closure can be executed repeatedly and even concurrently." msgstr "" -"`Fn` (наприклад, `add_3`) не споживає і не змінює захоплені значення, або, " -"можливо, не захоплює взагалі нічого. Ії можна викликати кілька разів " -"одночасно." +"`Fn` (наприклад, `add_3`) не споживає і не змінює захоплені значення. Вона " +"може бути викликана, потребуючи лише спільного посилання на закриття, що " +"означає, що замикання може бути виконано багаторазово і навіть одночасно." -#: src/std-traits/closures.md:41 +#: src/std-traits/closures.md:42 msgid "" -"An `FnMut` (e.g. `accumulate`) might mutate captured values. You can call it " -"multiple times, but not concurrently." +"An `FnMut` (e.g. `accumulate`) might mutate captured values. The closure " +"object is accessed via exclusive reference, so it can be called repeatedly " +"but not concurrently." msgstr "" -"`FnMut` (наприклад, `accumulate`) може змінити захоплені значення. Ви можете " -"викликати ії кілька разів, але не одночасно." +"`FnMut` (наприклад, `accumulate`) може змінити захоплені значення. Доступ до " +"об'єкта замикання здійснюється за ексклюзивним посиланням, тому його можна " +"викликати багаторазово, але не одночасно." -#: src/std-traits/closures.md:44 +#: src/std-traits/closures.md:46 msgid "" -"If you have an `FnOnce` (e.g. `multiply_sum`), you may only call it once. It " -"might consume captured values." +"If you have an `FnOnce` (e.g. `multiply_sum`), you may only call it once. " +"Doing so consumes the closure and any values captured by move." msgstr "" "Якщо у вас є `FnOnce` (наприклад, `multiply_sum`), ви можете викликати ії " -"лише один раз. Вона може споживати захоплені значення." +"лише один раз. У такому випадку замикання поглинається разом з усіма " +"значеннями, захопленими під час переміщення." -#: src/std-traits/closures.md:47 +#: src/std-traits/closures.md:49 msgid "" "`FnMut` is a subtype of `FnOnce`. `Fn` is a subtype of `FnMut` and `FnOnce`. " "I.e. you can use an `FnMut` wherever an `FnOnce` is called for, and you can " @@ -7387,7 +7459,7 @@ msgstr "" "можете використовувати `FnMut` усюди, де викликається `FnOnce`, і ви можете " "використовувати `Fn` усюди, де викликається `FnMut` або `FnOnce`." -#: src/std-traits/closures.md:51 +#: src/std-traits/closures.md:53 msgid "" "When you define a function that takes a closure, you should take `FnOnce` if " "you can (i.e. you call it once), or `FnMut` else, and last `Fn`. This allows " @@ -7398,40 +7470,48 @@ msgstr "" "іншому випадку, і в останню чергу `Fn`. Це забезпечує найбільшу гнучкість " "для того, хто викликає функцію." -#: src/std-traits/closures.md:55 +#: src/std-traits/closures.md:57 msgid "" "In contrast, when you have a closure, the most flexible you can have is `Fn` " -"(it can be passed everywhere), then `FnMut`, and lastly `FnOnce`." +"(which can be passed to a consumer of any of the 3 closure traits), then " +"`FnMut`, and lastly `FnOnce`." msgstr "" -"На противагу цьому, коли у вас є закриття, найбільш гнучким є `Fn` (його " -"можна передавати скрізь), потім `FnMut` і, нарешті, `FnOnce`." +"На противагу цьому, коли у вас є закриття, найбільш гнучким є `Fn` (яка може " +"бути передана споживачеві будь-якої з 3 трейтів замикання), потім `FnMut` і, " +"нарешті, `FnOnce`." -#: src/std-traits/closures.md:58 +#: src/std-traits/closures.md:61 msgid "" "The compiler also infers `Copy` (e.g. for `add_3`) and `Clone` (e.g. " -"`multiply_sum`), depending on what the closure captures." +"`multiply_sum`), depending on what the closure captures. Function pointers " +"(references to `fn` items) implement `Copy` and `Fn`." msgstr "" "Компілятор також виводить `Copy` (наприклад, для `add_3`) і `Clone` " -"(наприклад `multiply_sum`), залежно від того, що захоплює замикання." +"(наприклад `multiply_sum`), залежно від того, що захоплює замикання. " +"Покажчики функцій (посилання на елементи `fn`) реалізують `Copy` та `Fn`." -#: src/std-traits/closures.md:61 +#: src/std-traits/closures.md:65 msgid "" -"By default, closures will capture by reference if they can. The `move` " -"keyword makes them capture by value." +"By default, closures will capture each variable from an outer scope by the " +"least demanding form of access they can (by shared reference if possible, " +"then exclusive reference, then by move). The `move` keyword forces capture " +"by value." msgstr "" -"За замовчуванням закриття захоплюють за посиланням, якщо це можливо. Ключове " -"слово `move` змушує їх захоплювати за значенням." +"За замовчуванням замикання захоплюють кожну змінну із зовнішньої області " +"видимості найменш вибагливою формою доступу (за спільним посиланням, якщо це " +"можливо, потім за ексклюзивним посиланням, потім за переміщенням). Ключове " +"слово `move` змушує захоплювати за значенням." -#: src/std-traits/closures.md:66 src/smart-pointers/trait-objects.md:96 +#: src/std-traits/closures.md:71 src/smart-pointers/trait-objects.md:96 #: src/smart-pointers/trait-objects.md:97 msgid "\"{} {}\"" msgstr "\"{} {}\"" -#: src/std-traits/closures.md:70 +#: src/std-traits/closures.md:75 msgid "\"Hi\"" msgstr "\"Привіт\"" -#: src/std-traits/closures.md:71 +#: src/std-traits/closures.md:76 msgid "\"Greg\"" msgstr "\" Грег\"" @@ -7638,11 +7718,9 @@ msgstr "" "можна буде звертатися." #: src/memory-management/approaches.md:17 -msgid "" -"Typically implemented with reference counting, garbage collection, or RAII." +msgid "Typically implemented with reference counting or garbage collection." msgstr "" -"Зазвичай реалізується за допомогою підрахунку посилань, збору сміття або " -"RAII." +"Зазвичай реалізується за допомогою підрахунку посилань або збору сміття." #: src/memory-management/approaches.md:19 msgid "Rust offers a new mix:" @@ -7755,6 +7833,7 @@ msgid "An assignment will transfer _ownership_ between variables:" msgstr "Присвоєння переміщує _володіння_ між змінними:" #: src/memory-management/move.md:11 +#: src/concurrency/async-control-flow/select.md:32 msgid "\"Hello!\"" msgstr "\"Привіт!\"" @@ -7841,6 +7920,7 @@ msgid "\"Hello {name}\"" msgstr "\"Привіт {name}\"" #: src/memory-management/move.md:71 src/memory-management/clone.md:16 +#: src/android/aidl/types/parcelables.md:34 #: src/android/interoperability/java.md:57 msgid "\"Alice\"" msgstr "\"Alice\"" @@ -8375,24 +8455,26 @@ msgstr "" #: src/smart-pointers/box.md:34 msgid "" -"Recursive data types or data types with dynamic sizes need to use a `Box`:" +"Recursive data types or data types with dynamic sizes cannot be stored " +"inline without a pointer indirection, which can be worked around using `Box`:" msgstr "" -"Для рекурсивних типів даних або типів даних із динамічними розмірами " -"потрібно використовувати `Box`:" +"Рекурсивні типи даних або типи даних з динамічним розміром не можуть " +"зберігатися вбудованими без перенаправлення вказівника, що можна обійти за " +"допомогою `Box`:" -#: src/smart-pointers/box.md:39 +#: src/smart-pointers/box.md:40 msgid "/// A non-empty list: first element and the rest of the list.\n" msgstr "/// Непорожній список: перший елемент та решта списку.\n" -#: src/smart-pointers/box.md:41 +#: src/smart-pointers/box.md:42 msgid "/// An empty list.\n" msgstr "/// Порожній список.\n" -#: src/smart-pointers/box.md:48 +#: src/smart-pointers/box.md:49 msgid "\"{list:?}\"" msgstr "\"{list:?}\"" -#: src/smart-pointers/box.md:52 +#: src/smart-pointers/box.md:53 msgid "" "```bob\n" " Stack Heap\n" @@ -8432,7 +8514,7 @@ msgstr "" "- - - - -'\n" "```" -#: src/smart-pointers/box.md:67 +#: src/smart-pointers/box.md:68 msgid "" "`Box` is like `std::unique_ptr` in C++, except that it's guaranteed to be " "not null." @@ -8440,19 +8522,19 @@ msgstr "" "`Box` схожий на `std::unique_ptr` у C++, за винятком того, що він " "гарантовано не буде null." -#: src/smart-pointers/box.md:69 +#: src/smart-pointers/box.md:70 msgid "A `Box` can be useful when you:" msgstr "`Box` може бути корисним, коли ви:" -#: src/smart-pointers/box.md:70 +#: src/smart-pointers/box.md:71 msgid "" -"have a type whose size that can't be known at compile time, but the Rust " -"compiler wants to know an exact size." +"have a type whose size can't be known at compile time, but the Rust compiler " +"wants to know an exact size." msgstr "" "маєте тип, розмір якого не може бути відомий під час компіляції, але " "компілятор Rust хоче знати точний розмір." -#: src/smart-pointers/box.md:72 +#: src/smart-pointers/box.md:73 msgid "" "want to transfer ownership of a large amount of data. To avoid copying large " "amounts of data on the stack, instead store the data on the heap in a `Box` " @@ -8462,7 +8544,7 @@ msgstr "" "великих обсягів даних у стеку, натомість зберігайте дані в купі в `Box`, щоб " "переміщувався лише вказівник." -#: src/smart-pointers/box.md:76 +#: src/smart-pointers/box.md:77 msgid "" "If `Box` was not used and we attempted to embed a `List` directly into the " "`List`, the compiler would not be able to compute a fixed size for the " @@ -8472,7 +8554,7 @@ msgstr "" "безпосередньо в `List`, компілятор не зміг би обчислити фіксований розмір " "структури в пам’яті (`List` мав би нескінченний розмір)." -#: src/smart-pointers/box.md:80 +#: src/smart-pointers/box.md:81 msgid "" "`Box` solves this problem as it has the same size as a regular pointer and " "just points at the next element of the `List` in the heap." @@ -8480,7 +8562,7 @@ msgstr "" "`Box` вирішує цю проблему, оскільки має той самий розмір, що й звичайний " "вказівник, і лише вказує на наступний елемент `List` у купі." -#: src/smart-pointers/box.md:83 +#: src/smart-pointers/box.md:84 msgid "" "Remove the `Box` in the List definition and show the compiler error. We get " "the message \"recursive without indirection\", because for data recursion, " @@ -8492,11 +8574,11 @@ msgstr "" "рекурсії даних ми повинні використовувати посередництво, `Box` або якесь " "посилання, замість того, щоб зберігати значення безпосередньо." -#: src/smart-pointers/box.md:90 +#: src/smart-pointers/box.md:91 msgid "Niche Optimization" msgstr "Нішева оптимізація" -#: src/smart-pointers/box.md:92 +#: src/smart-pointers/box.md:93 msgid "" "Though `Box` looks like `std::unique_ptr` in C++, it cannot be empty/null. " "This makes `Box` one of the types that allow the compiler to optimize " @@ -8506,7 +8588,7 @@ msgstr "" "нульовим. Це робить `Box` одним з типів, які дозволяють компілятору " "оптимізувати зберігання деяких переліків." -#: src/smart-pointers/box.md:96 +#: src/smart-pointers/box.md:97 msgid "" "For example, `Option>` has the same size, as just `Box`, because " "compiler uses NULL-value to discriminate variants instead of using explicit " @@ -8518,23 +8600,23 @@ msgstr "" "замість використання явного тегу ([\"Оптимізація нульового вказівника\"]" "(https://doc.rust-lang.org/std/option/#representation)):" -#: src/smart-pointers/box.md:106 +#: src/smart-pointers/box.md:107 msgid "\"Just box\"" msgstr "\"Just box\"" -#: src/smart-pointers/box.md:108 +#: src/smart-pointers/box.md:109 msgid "\"Optional box\"" msgstr "\"Optional box\"" -#: src/smart-pointers/box.md:114 +#: src/smart-pointers/box.md:115 msgid "\"Size of just_box: {}\"" msgstr "\"Розмір just_box: {}\"" -#: src/smart-pointers/box.md:115 +#: src/smart-pointers/box.md:116 msgid "\"Size of optional_box: {}\"" msgstr "\"Розмір optional_box: {}\"" -#: src/smart-pointers/box.md:116 +#: src/smart-pointers/box.md:117 msgid "\"Size of none: {}\"" msgstr "\"Розмір none: {}\"" @@ -8558,11 +8640,11 @@ msgstr "\"b: {b}\"" #: src/smart-pointers/rc.md:22 msgid "" -"See [`Arc`](../concurrency/shared_state/arc.md) and [`Mutex`](https://doc." +"See [`Arc`](../concurrency/shared-state/arc.md) and [`Mutex`](https://doc." "rust-lang.org/std/sync/struct.Mutex.html) if you are in a multi-threaded " "context." msgstr "" -"Дивіться [`Arc`](../concurrency/shared_state/arc.md) та [`Mutex`](https://" +"Дивіться [`Arc`](../concurrency/shared-state/arc.md) та [`Mutex`](https://" "doc.rust-lang.org/std/sync/struct.Mutex.html), якщо ви працюєте у " "багатопотоковому контексті." @@ -8652,8 +8734,8 @@ msgid "" "| :\n" ": +-----------+-------+ : | : | " "'-------. :\n" -": : | : | data:" -"\"Dog\"| :\n" +": : | : | data:\"Dog" +"\"| :\n" ": : | : | +-------+--|-------" "+ :\n" "`- - - - - - - - - - - - - -' | : +---|-+-----+ | name | o, 4, 4 " @@ -8675,16 +8757,16 @@ msgid "" "vtable :\n" " : | | +----------------------" "+ :\n" -" : | `----->| \"::" -"talk\" | :\n" +" : | `----->| \"::talk" +"\" | :\n" " : | +----------------------" "+ :\n" " : | " "vtable :\n" " : | +----------------------" "+ :\n" -" : '----------->| \"::" -"talk\" | :\n" +" : '----------->| \"::talk" +"\" | :\n" " : +----------------------" "+ :\n" " : :\n" @@ -8709,8 +8791,8 @@ msgstr "" "| :\n" ": +-----------+-------+ : | : | " "'-------. :\n" -": : | : | data:" -"\"Dog\"| :\n" +": : | : | data:\"Dog" +"\"| :\n" ": : | : | +-------+--|-------" "+ :\n" "`- - - - - - - - - - - - - -' | : +---|-+-----+ | name | o, 4, 4 " @@ -8732,16 +8814,16 @@ msgstr "" "vtable :\n" " : | | +----------------------" "+ :\n" -" : | `----->| \"::" -"talk\" | :\n" +" : | `----->| \"::talk" +"\" | :\n" " : | +----------------------" "+ :\n" " : | " "vtable :\n" " : | +----------------------" "+ :\n" -" : '----------->| \"::" -"talk\" | :\n" +" : '----------->| \"::talk" +"\" | :\n" " : +----------------------" "+ :\n" " : :\n" @@ -9052,15 +9134,57 @@ msgstr "" "перевірки під час виконання." #: src/borrowing/interior-mutability.md:15 -msgid "`RefCell`" -msgstr "`RefCell`" +msgid "`Cell`" +msgstr "`Cell`" -#: src/borrowing/interior-mutability.md:21 -#: src/borrowing/interior-mutability.md:47 +#: src/borrowing/interior-mutability.md:17 +msgid "" +"`Cell` wraps a value and allows getting or setting the value using only a " +"shared reference to the `Cell`. However, it does not allow any references to " +"the inner value. Since there are no references, borrowing rules cannot be " +"broken." +msgstr "" +"`Cell` обгортає значення і дозволяє отримати або встановити значення, " +"використовуючи лише спільне посилання на `Cell`. Однак, вона не дозволяє " +"жодних посилань на внутрішнє значення. Оскільки посилань немає, правила " +"запозичення не можуть бути порушені." + +#: src/borrowing/interior-mutability.md:25 +#: src/borrowing/interior-mutability.md:49 msgid "// Note that `cell` is NOT declared as mutable.\n" msgstr "// Зауважте, що `cell` НЕ оголошено як мутабельну.\n" -#: src/borrowing/interior-mutability.md:28 +#: src/borrowing/interior-mutability.md:33 +msgid "`RefCell`" +msgstr "`RefCell`" + +#: src/borrowing/interior-mutability.md:35 +msgid "" +"`RefCell` allows accessing and mutating a wrapped value by providing " +"alternative types `Ref` and `RefMut` that emulate `&T`/`&mut T` without " +"actually being Rust references." +msgstr "" +"`RefCell` дозволяє отримувати доступ до обгорнутого значення та змінювати " +"його, надаючи альтернативні типи `Ref` та `RefMut`, які імітують `&T`/`&mut " +"T`, не будучи насправді Rust посиланнями." + +#: src/borrowing/interior-mutability.md:39 +msgid "" +"These types perform dynamic checks using a counter in the `RefCell` to " +"prevent existence of a `RefMut` alongside another `Ref`/`RefMut`." +msgstr "" +"Ці типи виконують динамічні перевірки за допомогою лічильника в `RefCell`, " +"щоб запобігти існуванню `RefMut` поряд з іншим `Ref`/`RefMut`." + +#: src/borrowing/interior-mutability.md:42 +msgid "" +"By implementing `Deref` (and `DerefMut` for `RefMut`), these types allow " +"calling methods on the inner value without allowing references to escape." +msgstr "" +"Завдяки реалізації `Deref` (і `DerefMut` для `RefMut`), ці типи дозволяють " +"викликати методи за внутрішнім значенням, не дозволяючи посиланням втекти." + +#: src/borrowing/interior-mutability.md:56 msgid "" "// This triggers an error at runtime.\n" " // let other = cell.borrow();\n" @@ -9070,26 +9194,11 @@ msgstr "" " // let other = cell.borrow();\n" " // println!(\"{}\", *other);\n" -#: src/borrowing/interior-mutability.md:33 +#: src/borrowing/interior-mutability.md:61 msgid "\"{cell:?}\"" msgstr "\"{cell:?}\"" -#: src/borrowing/interior-mutability.md:37 -msgid "`Cell`" -msgstr "`Cell`" - -#: src/borrowing/interior-mutability.md:39 -msgid "" -"`Cell` wraps a value and allows getting or setting the value, even with a " -"shared reference to the `Cell`. However, it does not allow any references to " -"the value. Since there are no references, borrowing rules cannot be broken." -msgstr "" -"`Cell` обгортає значення і дозволяє отримати або встановити значення, навіть " -"за допомогою спільного посилання на `Cell`. Однак, він не дозволяє " -"посилатися на значення. Оскільки посилань немає, правила запозичення не " -"можуть бути порушені." - -#: src/borrowing/interior-mutability.md:57 +#: src/borrowing/interior-mutability.md:67 msgid "" "The main thing to take away from this slide is that Rust provides _safe_ " "ways to modify data behind a shared reference. There are a variety of ways " @@ -9099,7 +9208,7 @@ msgstr "" "способи модифікації даних за спільним посиланням. Існує безліч способів " "забезпечити цю захищеність, і `RefCell` та `Cell` - два з них." -#: src/borrowing/interior-mutability.md:61 +#: src/borrowing/interior-mutability.md:71 msgid "" "`RefCell` enforces Rust's usual borrowing rules (either multiple shared " "references or a single exclusive reference) with a runtime check. In this " @@ -9111,7 +9220,7 @@ msgstr "" "цьому випадку всі запозичення дуже короткі і ніколи не перетинаються, тому " "перевірки завжди проходять успішно." -#: src/borrowing/interior-mutability.md:66 +#: src/borrowing/interior-mutability.md:76 msgid "" "The extra block in the `RefCell` example is to end the borrow created by the " "call to `borrow_mut` before we print the cell. Trying to print a borrowed " @@ -9119,10 +9228,10 @@ msgid "" msgstr "" "Додатковий блок у прикладі `RefCell` призначений для завершення запозичення, " "створеного викликом `borrow_mut`, до того, як ми надрукуємо комірку. Спроба " -"надрукувати запозичену комірку `RefCell` просто покаже повідомлення " -"`\"{borrowed}\"`." +"надрукувати запозичену комірку `RefCell` просто покаже повідомлення `" +"\"{borrowed}\"`." -#: src/borrowing/interior-mutability.md:70 +#: src/borrowing/interior-mutability.md:80 msgid "" "`Cell` is a simpler means to ensure safety: it has a `set` method that takes " "`&self`. This needs no runtime check, but requires moving values, which can " @@ -9132,7 +9241,7 @@ msgstr "" "який приймає значення `&self`. Це не потребує перевірки під час виконання, " "але вимагає переміщення значень, що може мати свою ціну." -#: src/borrowing/interior-mutability.md:74 +#: src/borrowing/interior-mutability.md:84 msgid "" "Both `RefCell` and `Cell` are `!Sync`, which means `&RefCell` and `&Cell` " "can't be passed between threads. This prevents two threads trying to access " @@ -9170,8 +9279,8 @@ msgstr "" #: src/borrowing/exercise.md:49 msgid "" -"\"Update a user's statistics based on measurements from a visit to the " -"doctor\"" +"\"Update a user's statistics based on measurements from a visit to the doctor" +"\"" msgstr "" "\" Оновити статистику користувача на основі вимірювань під час візиту до " "лікаря\"" @@ -9497,75 +9606,89 @@ msgstr "/// Varint WireType вказує на те, що значення є о #: src/lifetimes/exercise.md:52 src/lifetimes/solution.md:8 msgid "" -"//I64, -- not needed for this exercise\n" +"/// The I64 WireType indicates that the value is precisely 8 bytes in\n" +" /// little-endian order containing a 64-bit signed integer or double " +"type.\n" +" //I64, -- not needed for this exercise\n" " /// The Len WireType indicates that the value is a length represented as " "a\n" " /// VARINT followed by exactly that number of bytes.\n" msgstr "" +"/// I64 WireType вказує на те, що значення має точно 8 байт у little-endian\n" +" /// порядку та містить 64-бітне ціле зі знаком або тип з плаваючою комою " +"подвійної точності.\n" "//I64, -- не потрібно для цієї вправи\n" " /// Len WireType вказує на те, що значення є довжиною, представленою у " "вигляді \n" " /// VARINT за яким слідує рівно стільки байт.\n" -#: src/lifetimes/exercise.md:56 src/lifetimes/solution.md:12 +#: src/lifetimes/exercise.md:58 src/lifetimes/solution.md:14 msgid "" -"/// The I32 WireType indicates that the value is precisely 4 bytes in\n" -" /// little-endian order containing a 32-bit signed integer.\n" +"// The I32 WireType indicates that the value is precisely 4 bytes in\n" +" // little-endian order containing a 32-bit signed integer or float " +"type.\n" +" //I32, -- not needed for this exercise\n" msgstr "" -"/// Тип WireType I32 вказує на те, що значення - це рівно 4 байти в\n" -" /// little-endian порядку, що містять 32-бітне ціле число зі знаком.\n" +"// Тип WireType I32 вказує на те, що значення - це рівно 4 байти в\n" +" // little-endian порядку, що містять 32-бітне ціле число зі знаком або " +"тип з плаваючою комою.\n" +" //I32, -- не потрібно для цієї вправи\n" -#: src/lifetimes/exercise.md:61 src/lifetimes/solution.md:17 +#: src/lifetimes/exercise.md:63 src/lifetimes/solution.md:19 msgid "/// A field's value, typed based on the wire type.\n" msgstr "/// Значення поля, введене на основі wire type.\n" -#: src/lifetimes/exercise.md:65 src/lifetimes/solution.md:21 +#: src/lifetimes/exercise.md:67 src/lifetimes/solution.md:23 msgid "//I64(i64), -- not needed for this exercise\n" msgstr "//I64(i64), -- не потрібно для цієї вправи\n" -#: src/lifetimes/exercise.md:70 src/lifetimes/solution.md:26 +#: src/lifetimes/exercise.md:69 src/lifetimes/solution.md:25 +msgid "//I32(i32), -- not needed for this exercise\n" +msgstr "//I32(i32), -- не потрібно для цієї вправи\n" + +#: src/lifetimes/exercise.md:72 src/lifetimes/solution.md:28 msgid "/// A field, containing the field number and its value.\n" msgstr "/// Поле, що містить номер поля та його значення.\n" -#: src/lifetimes/exercise.md:85 src/lifetimes/solution.md:41 +#: src/lifetimes/exercise.md:87 src/lifetimes/solution.md:43 msgid "//1 => WireType::I64, -- not needed for this exercise\n" msgstr "//1 => WireType::I64, -- не потрібно для цієї вправи\n" -#: src/lifetimes/exercise.md:88 src/lifetimes/solution.md:44 +#: src/lifetimes/exercise.md:89 src/lifetimes/solution.md:45 +msgid "//5 => WireType::I32, -- not needed for this exercise\n" +msgstr "//5 => WireType::I32, -- не потрібно для цієї вправи\n" + +#: src/lifetimes/exercise.md:90 src/lifetimes/solution.md:46 msgid "\"Invalid wire type: {value}\"" msgstr "\"Неправильний wire type: {value}\"" -#: src/lifetimes/exercise.md:96 src/lifetimes/solution.md:52 +#: src/lifetimes/exercise.md:98 src/lifetimes/solution.md:54 msgid "\"Expected string to be a `Len` field\"" msgstr "\"Очікуваний рядок має бути полем `Len`\"" -#: src/lifetimes/exercise.md:98 src/lifetimes/solution.md:54 +#: src/lifetimes/exercise.md:100 src/lifetimes/solution.md:56 msgid "\"Invalid string\"" msgstr "\"Неправильний рядок\"" -#: src/lifetimes/exercise.md:103 src/lifetimes/solution.md:59 +#: src/lifetimes/exercise.md:105 src/lifetimes/solution.md:61 msgid "\"Expected bytes to be a `Len` field\"" msgstr "\"Очікувані байти мають бути полем `Len`\"" -#: src/lifetimes/exercise.md:110 src/lifetimes/solution.md:66 +#: src/lifetimes/exercise.md:112 src/lifetimes/solution.md:68 msgid "\"Expected `u64` to be a `Varint` field\"" msgstr "\"Очікувалося, що `u64` буде полем `Varint`\"" -#: src/lifetimes/exercise.md:118 src/lifetimes/solution.md:74 -msgid "\"Expected `i32` to be an `I32` field\"" -msgstr "\"Очікувалося, що `i32` буде полем `I32`\"" - -#: src/lifetimes/exercise.md:123 src/lifetimes/solution.md:79 +#: src/lifetimes/exercise.md:117 src/lifetimes/solution.md:73 msgid "" "/// Parse a VARINT, returning the parsed value and the remaining bytes.\n" msgstr "" "/// Розбір VARINT з поверненням розібраного значення та решти байтів.\n" -#: src/lifetimes/exercise.md:128 src/lifetimes/solution.md:84 +#: src/lifetimes/exercise.md:122 src/lifetimes/solution.md:78 msgid "\"Not enough bytes for varint\"" msgstr "\"Недостатньо байт для varint\"" -#: src/lifetimes/exercise.md:131 src/lifetimes/solution.md:87 +#: src/lifetimes/exercise.md:125 src/lifetimes/solution.md:81 msgid "" "// This is the last byte of the VARINT, so convert it to\n" " // a u64 and return it.\n" @@ -9573,23 +9696,23 @@ msgstr "" "// Це останній байт VARINT, тому перетворюємо його\n" " // в u64 і повертаємо.\n" -#: src/lifetimes/exercise.md:141 src/lifetimes/solution.md:97 +#: src/lifetimes/exercise.md:135 src/lifetimes/solution.md:91 msgid "// More than 7 bytes is invalid.\n" msgstr "// Більше 7 байт є неприпустимим.\n" -#: src/lifetimes/exercise.md:142 src/lifetimes/solution.md:98 +#: src/lifetimes/exercise.md:136 src/lifetimes/solution.md:92 msgid "\"Too many bytes for varint\"" msgstr "\"Забагато байт для varint\"" -#: src/lifetimes/exercise.md:144 src/lifetimes/solution.md:100 +#: src/lifetimes/exercise.md:138 src/lifetimes/solution.md:94 msgid "/// Convert a tag into a field number and a WireType.\n" msgstr "/// Перетворити тег у номер поля та WireType.\n" -#: src/lifetimes/exercise.md:152 src/lifetimes/solution.md:107 +#: src/lifetimes/exercise.md:146 src/lifetimes/solution.md:101 msgid "/// Parse a field, returning the remaining bytes\n" msgstr "/// Розбір поля з поверненням залишку байтів\n" -#: src/lifetimes/exercise.md:158 +#: src/lifetimes/exercise.md:152 msgid "" "\"Based on the wire type, build a Field, consuming as many bytes as " "necessary.\"" @@ -9597,11 +9720,11 @@ msgstr "" "\"На основі wire type побудуйте Field, використовуючи стільки байт, скільки " "потрібно.\"" -#: src/lifetimes/exercise.md:160 +#: src/lifetimes/exercise.md:154 msgid "\"Return the field, and any un-consumed bytes.\"" msgstr "\"Повернути поле та всі невикористані байти.\"" -#: src/lifetimes/exercise.md:162 src/lifetimes/solution.md:138 +#: src/lifetimes/exercise.md:156 src/lifetimes/solution.md:123 msgid "" "/// Parse a message in the given data, calling `T::add_field` for each field " "in\n" @@ -9615,11 +9738,11 @@ msgstr "" "///\n" "/// Споживаються всі вхідні дані.\n" -#: src/lifetimes/exercise.md:189 +#: src/lifetimes/exercise.md:179 msgid "// TODO: Implement ProtoMessage for Person and PhoneNumber.\n" msgstr "// TODO: Реалізувати ProtoMessage для Person та PhoneNumber.\n" -#: src/lifetimes/exercise.md:207 +#: src/lifetimes/exercise.md:197 msgid "" "In this exercise there are various cases where protobuf parsing might fail, " "e.g. if you try to parse an `i32` when there are fewer than 4 bytes left in " @@ -9634,22 +9757,44 @@ msgstr "" "виникають помилки. На четвертий день ми розглянемо обробку помилок у Rust " "більш детально." -#: src/lifetimes/solution.md:119 +#: src/lifetimes/solution.md:113 msgid "\"len not a valid `usize`\"" msgstr "\"len не є допустимим `usize`\"" -#: src/lifetimes/solution.md:121 src/lifetimes/solution.md:128 +#: src/lifetimes/solution.md:115 msgid "\"Unexpected EOF\"" msgstr "\"Несподіваний EOF\"" -#: src/lifetimes/solution.md:131 -msgid "// Unwrap error because `value` is definitely 4 bytes long.\n" -msgstr "// Помилка розгортання, оскільки `value` точно має довжину 4 байти.\n" - -#: src/lifetimes/solution.md:172 src/lifetimes/solution.md:182 +#: src/lifetimes/solution.md:159 src/lifetimes/solution.md:169 msgid "// skip everything else\n" msgstr "// пропустити все інше\n" +#: src/lifetimes/solution.md:193 src/lifetimes/solution.md:225 +#: src/modules/exercise.md:106 src/modules/exercise.md:108 +#: src/modules/exercise.md:112 src/modules/exercise.md:126 +#: src/modules/exercise.md:130 src/modules/solution.md:110 +#: src/modules/solution.md:114 src/modules/solution.md:165 +#: src/modules/solution.md:167 src/modules/solution.md:171 +#: src/testing/unit-tests.md:31 src/testing/solution.md:89 +msgid "\"\"" +msgstr "\"\"" + +#: src/lifetimes/solution.md:204 +msgid "\"beautiful name\"" +msgstr "\"красиве ім'я\"" + +#: src/lifetimes/solution.md:212 +msgid "\"Evan\"" +msgstr "\"Еван\"" + +#: src/lifetimes/solution.md:227 +msgid "\"+1234-777-9090\"" +msgstr "" + +#: src/lifetimes/solution.md:227 +msgid "\"home\"" +msgstr "\"дім\"" + #: src/welcome-day-4.md msgid "" "minutes: 3 course: Fundamentals session: Day 4 Morning target_minutes: 180" @@ -9961,9 +10106,8 @@ msgstr "`src/main.rs` (для крейта виконуваного файлу)" #: src/modules/filesystem.md:22 msgid "" -"Modules defined in files can be documented, too, using \"inner doc " -"comments\". These document the item that contains them -- in this case, a " -"module." +"Modules defined in files can be documented, too, using \"inner doc comments" +"\". These document the item that contains them -- in this case, a module." msgstr "" "Модулі, визначені у файлах, також можна документувати за допомогою " "\"внутрішніх коментарів документа\". Вони документують елемент, який їх " @@ -10273,15 +10417,6 @@ msgstr "" msgid "\"+-{:-`, `Display`, and the `Error` trait." msgstr "" -"Крейти [thiserror](https://docs.rs/thiserror/) та [`anyhow`](https://docs.rs/" -"anyhow/) широко використовуються для спрощення обробки помилок." +"Крейт [`thiserror`](https://docs.rs/thiserror/) містить макроси, які " +"допомагають уникнути повторювань при визначенні типів помилок. Він містить " +"похідні макроси, які допомагають реалізувати `From`, `Display` та " +"трейт`Error`." -#: src/error-handling/thiserror-and-anyhow.md:11 -msgid "" -"`thiserror` is often used in libraries to create custom error types that " -"implement `From`." -msgstr "" -"`thiserror` часто використовується у бібліотеках для створення " -"користувацьких типів помилок, які реалізують `From`." +#: src/error-handling/thiserror.md:18 +msgid "\"I/O error: {0}\"" +msgstr "\"I/O помилка: {e}\"" -#: src/error-handling/thiserror-and-anyhow.md:13 -msgid "" -"`anyhow` is often used by applications to help with error handling in " -"functions, including adding contextual information to your errors." -msgstr "" -"`anyhow` часто використовується програмами для полегшення обробки помилок у " -"функціях, зокрема для додавання контекстної інформації до ваших помилок." - -#: src/error-handling/thiserror-and-anyhow.md:23 +#: src/error-handling/thiserror.md:20 src/error-handling/anyhow.md:21 msgid "\"Found no username in {0}\"" msgstr "\"Не знайдено імені користувача в {0}\"" -#: src/error-handling/thiserror-and-anyhow.md:29 -msgid "\"Failed to open {path}\"" -msgstr "\"Не вдалося відкрити {path}\"" - -#: src/error-handling/thiserror-and-anyhow.md:31 -msgid "\"Failed to read\"" -msgstr "\"Не вдалося прочитати\"" - -#: src/error-handling/thiserror-and-anyhow.md:39 +#: src/error-handling/thiserror.md:34 src/error-handling/anyhow.md:37 msgid "//fs::write(\"config.dat\", \"\").unwrap();\n" msgstr "//fs::write(\"config.dat\", \"\").unwrap();\n" -#: src/error-handling/thiserror-and-anyhow.md:41 +#: src/error-handling/thiserror.md:36 src/error-handling/anyhow.md:39 msgid "\"Username: {username}\"" msgstr "\"Ім'я користувача: {username}\"" -#: src/error-handling/thiserror-and-anyhow.md:42 +#: src/error-handling/thiserror.md:37 src/error-handling/anyhow.md:40 msgid "\"Error: {err:?}\"" msgstr "\"Помилка: {err:?}\"" -#: src/error-handling/thiserror-and-anyhow.md:49 -msgid "`thiserror`" -msgstr "`thiserror`" - -#: src/error-handling/thiserror-and-anyhow.md:51 +#: src/error-handling/thiserror.md:44 msgid "" "The `Error` derive macro is provided by `thiserror`, and has lots of useful " "attributes to help define error types in a compact way." @@ -11153,20 +11261,50 @@ msgstr "" "Похідний макрос `Error` надається `thiserror` і має багато корисних " "атрибутів для компактного визначення типів помилок." -#: src/error-handling/thiserror-and-anyhow.md:53 -msgid "The `std::error::Error` trait is derived automatically." -msgstr "Трейт `std::error::Error` виводиться автоматично." - -#: src/error-handling/thiserror-and-anyhow.md:54 +#: src/error-handling/thiserror.md:46 msgid "The message from `#[error]` is used to derive the `Display` trait." msgstr "" "Повідомлення з `#[error]` використовується для отримання трейту `Display`." -#: src/error-handling/thiserror-and-anyhow.md:56 -msgid "`anyhow`" -msgstr "`anyhow`" +#: src/error-handling/thiserror.md:47 +msgid "" +"Note that the (`thiserror::`)`Error` derive macro, while it has the effect " +"of implementing the (`std::error::`)`Error` trait, is not the same this; " +"traits and macros do not share a namespace." +msgstr "" +"Зауважте, що похідний макрос (`thiserror::`)`Error`, хоча і має ефект " +"реалізації трейту (`std::error::`)`Error`, не є тим самим; трейти та макроси " +"не мають спільного простору імен." + +#: src/error-handling/anyhow.md:7 +msgid "" +"The [`anyhow`](https://docs.rs/anyhow/) crate provides a rich error type " +"with support for carrying additional contextual information, which can be " +"used to provide a semantic trace of what the program was doing leading up to " +"the error." +msgstr "" +"Крейт [`anyhow`](https://docs.rs/anyhow/) надає багатий тип помилок з " +"підтримкою передачі додаткової контекстної інформації, яка може бути " +"використана для семантичного відстеження дій програми, що призвели до " +"виникнення помилки." -#: src/error-handling/thiserror-and-anyhow.md:58 +#: src/error-handling/anyhow.md:11 +msgid "" +"This can be combined with the convenience macros from `thiserror` to avoid " +"writing out trait impls explicitly for custom error types." +msgstr "" +"Це можна поєднати зі зручними макросами з `thiserror`, щоб уникнути " +"написання реалізацій трейтів явно для користувацьких типів помилок." + +#: src/error-handling/anyhow.md:27 +msgid "\"Failed to open {path}\"" +msgstr "\"Не вдалося відкрити {path}\"" + +#: src/error-handling/anyhow.md:29 +msgid "\"Failed to read\"" +msgstr "\"Не вдалося прочитати\"" + +#: src/error-handling/anyhow.md:47 msgid "" "`anyhow::Error` is essentially a wrapper around `Box`. As such " "it's again generally not a good choice for the public API of a library, but " @@ -11176,29 +11314,24 @@ msgstr "" "це знову ж таки, як правило, не є хорошим вибором для загальнодоступного API " "бібліотеки, але широко використовується в програмах." -#: src/error-handling/thiserror-and-anyhow.md:61 +#: src/error-handling/anyhow.md:50 msgid "`anyhow::Result` is a type alias for `Result`." msgstr "" "`anyhow::Result` — це псевдонім типу для `Result`." -#: src/error-handling/thiserror-and-anyhow.md:62 -msgid "" -"Actual error type inside of it can be extracted for examination if necessary." -msgstr "" -"Фактичний тип помилки всередині нього можна вилучити для перевірки, якщо це " -"необхідно." - -#: src/error-handling/thiserror-and-anyhow.md:63 +#: src/error-handling/anyhow.md:51 msgid "" -"Functionality provided by `anyhow::Result` may be familiar to Go " -"developers, as it provides similar usage patterns and ergonomics to `(T, " -"error)` from Go." +"Functionality provided by `anyhow::Error` may be familiar to Go developers, " +"as it provides similar behavior to the Go `error` type and `Result` is much like a Go `(T, error)` (with the convention that " +"only one element of the pair is meaningful)." msgstr "" -"Функціональність, яку надає `anyhow::Result`, може бути знайома " -"розробникам Go, оскільки вона забезпечує подібні моделі використання та " -"ергономіку до `(T, error)` від Go." +"Функціональність, яку надає `anyhow::Error`, може бути знайома розробникам " +"Go, оскільки вона забезпечує поведінку, подібну до типу Go `error`, а " +"`Result` дуже схожа на Go `(T, error)` (з умовою, що " +"тільки один елемент пари є значущим)." -#: src/error-handling/thiserror-and-anyhow.md:66 +#: src/error-handling/anyhow.md:55 msgid "" "`anyhow::Context` is a trait implemented for the standard `Result` and " "`Option` types. `use anyhow::Context` is necessary to enable `.context()` " @@ -11208,6 +11341,18 @@ msgstr "" "`Option`. Використання `anyhow::Context` необхідне для того, щоб дозволити " "використання `.context()` та `.with_context()` для цих типів." +#: src/error-handling/anyhow.md:61 +msgid "" +"`anyhow::Error` has support for downcasting, much like `std::any::Any`; the " +"specific error type stored inside can be extracted for examination if " +"desired with [`Error::downcast`](https://docs.rs/anyhow/latest/anyhow/struct." +"Error.html#method.downcast)." +msgstr "" +"`anyhow::Error` має підтримку даункастингу, подібно до `std::any::Any`; " +"конкретний тип помилки, що зберігається всередині, може бути витягнутий для " +"вивчення за допомогою [`Error::downcast`](https://docs.rs/anyhow/latest/" +"anyhow/struct.Error.html#method.downcast)." + #: src/error-handling/exercise.md:5 msgid "Exercise: Rewriting with Result" msgstr "Вправа: Переписування з Result" @@ -11921,8 +12066,8 @@ msgid "" "`*const i8` to `&CStr`: you need something which can find the trailing `\\0` " "character," msgstr "" -"`*const i8` до `&CStr`: вам потрібно щось, що може знайти кінцевий символ " -"`\\0`," +"`*const i8` до `&CStr`: вам потрібно щось, що може знайти кінцевий символ `" +"\\0`," #: src/unsafe-rust/exercise.md:32 msgid "" @@ -12345,28 +12490,11 @@ msgstr "" #: src/android/build-rules.md msgid "" -"Soong has many similarities to Bazel, which is the open-source variant of " -"Blaze (used in google3)." +"Soong has many similarities to [Bazel](https://bazel.build/), which is the " +"open-source variant of Blaze (used in google3)." msgstr "" -"Soong має багато спільного з Bazel, який є варіантом Blaze з відкритим " -"вихідним кодом (використовується в google3)." - -#: src/android/build-rules.md -msgid "" -"There is a plan to transition [Android](https://source.android.com/docs/" -"setup/build/bazel/introduction), [ChromeOS](https://chromium.googlesource." -"com/chromiumos/bazel/), and [Fuchsia](https://source.android.com/docs/setup/" -"build/bazel/introduction) to Bazel." -msgstr "" -"Існує план переходу [Android](https://source.android.com/docs/setup/build/" -"bazel/introduction), [ChromeOS](https://chromium.googlesource.com/chromiumos/" -"bazel/) та [Fuchsia](https://source.android.com/docs/setup/build/bazel/" -"introduction) на Bazel." - -#: src/android/build-rules.md -msgid "Learning Bazel-like build rules is useful for all Rust OS developers." -msgstr "" -"Вивчення Bazel-подібних правил збірки корисно для всіх розробників Rust OS." +"Soong має багато спільного з [Bazel](https://bazel.build/), який є варіантом " +"Blaze з відкритим вихідним кодом (використовується в google3)." #: src/android/build-rules.md msgid "Fun fact: Data from Star Trek is a Soong-type Android." @@ -12561,35 +12689,35 @@ msgid "" msgstr "" "_birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl_:" -#: src/android/aidl/example-service/interface.md:8 +#: src/android/aidl/example-service/interface.md:9 #: src/android/aidl/example-service/service-bindings.md:9 #: src/android/aidl/example-service/changing-definition.md:8 msgid "/** Birthday service interface. */" msgstr "/** Інтерфейс сервісу Birthday. */" -#: src/android/aidl/example-service/interface.md:10 +#: src/android/aidl/example-service/interface.md:12 #: src/android/aidl/example-service/service-bindings.md:11 #: src/android/aidl/example-service/changing-definition.md:11 msgid "/** Generate a Happy Birthday message. */" msgstr "/** Генерує привітання з днем народження. */" -#: src/android/aidl/example-service/interface.md:15 +#: src/android/aidl/example-service/interface.md:17 msgid "_birthday_service/aidl/Android.bp_:" msgstr "_birthday_service/aidl/Android.bp_:" -#: src/android/aidl/example-service/interface.md:19 +#: src/android/aidl/example-service/interface.md:21 msgid "\"com.example.birthdayservice\"" msgstr "\"com.example.birthdayservice\"" -#: src/android/aidl/example-service/interface.md:20 +#: src/android/aidl/example-service/interface.md:22 msgid "\"com/example/birthdayservice/*.aidl\"" msgstr "\"com/example/birthdayservice/*.aidl\"" -#: src/android/aidl/example-service/interface.md:23 +#: src/android/aidl/example-service/interface.md:25 msgid "// Rust is not enabled by default\n" msgstr "// Rust не увімкнено за замовчуванням\n" -#: src/android/aidl/example-service/interface.md:32 +#: src/android/aidl/example-service/interface.md:34 msgid "" "Note that the directory structure under the `aidl/` directory needs to match " "the package name used in the AIDL file, i.e. the package is `com.example." @@ -13142,12 +13270,12 @@ msgstr "`Vec`" msgid "" "In Android 13 or higher, fixed-size arrays are supported, i.e. `T[N]` " "becomes `[T; N]`. Fixed-size arrays can have multiple dimensions (e.g. " -"int\\[3\\]\\[4\\]). In the Java backend, fixed-size arrays are represented " -"as array types." +"`int[3][4]`). In the Java backend, fixed-size arrays are represented as " +"array types." msgstr "" "В Android 13 і вище підтримуються масиви фіксованого розміру, тобто `T[N]` " "стає `[T; N]`. Масиви фіксованого розміру можуть мати декілька вимірів " -"(наприклад, int\\[3\\]\\[4\\]). У бекенді Java масиви фіксованого розміру " +"(наприклад, `int[3][4]`). У бекенді Java масиви фіксованого розміру " "представлені як типи масивів." #: src/android/aidl/types/arrays.md:18 @@ -13454,18 +13582,18 @@ msgstr "" #: src/android/testing/googletest.md:47 msgid "" "This just scratches the surface, there are many builtin matchers. Consider " -"going through the first chapter of [\"Advanced testing for Rust " -"applications\"](https://github.com/mainmatter/rust-advanced-testing-" -"workshop), a self-guided Rust course: it provides a guided introduction to " -"the library, with exercises to help you get comfortable with `googletest` " -"macros, its matchers and its overall philosophy." +"going through the first chapter of [\"Advanced testing for Rust applications" +"\"](https://rust-exercises.com/advanced-testing/), a self-guided Rust " +"course: it provides a guided introduction to the library, with exercises to " +"help you get comfortable with `googletest` macros, its matchers and its " +"overall philosophy." msgstr "" "Це лише поверхневий огляд, є багато вбудованих зрівнювачів. Подумайте про " "те, щоб прочитати перший розділ [\"Поглиблене тестування для прикладних " -"програм на Rust\"](https://github.com/mainmatter/rust-advanced-testing-" -"workshop), самовчитель з Rust: він надає керований вступ до бібліотеки з " -"вправами, які допоможуть вам освоїтися з макросами `googletest` , його " -"зрівнювачами і його загальною філософією." +"програм на Rust\"](https://rust-exercises.com/advanced-testing/), " +"самовчитель з Rust: він надає керований вступ до бібліотеки з вправами, які " +"допоможуть вам освоїтися з макросами `googletest` , його зрівнювачами і його " +"загальною філософією." #: src/android/testing/googletest.md:54 msgid "" @@ -13669,6 +13797,14 @@ msgstr "" msgid "The logs show up in `adb logcat`:" msgstr "Журнали відображаються в `adb logcat`:" +#: src/android/logging.md +msgid "" +"The logger implementation in `liblogger` is only needed in the final binary, " +"if you're logging from a library you only need the `log` facade crate." +msgstr "" +"Реалізація логгера у `liblogger` потрібна лише у фінальній версії, якщо ви " +"логіруєте з бібліотеки, вам знадобиться лише фасадний крейт`log`." + #: src/android/interoperability.md msgid "" "Rust has excellent support for interoperability with other languages. This " @@ -13718,11 +13854,10 @@ msgstr "\"{x}, {abs_x}\"" #: src/android/interoperability/with-c.md:21 msgid "" -"We already saw this in the [Safe FFI Wrapper exercise](../../exercises/day-3/" -"safe-ffi-wrapper.md)." +"We already saw this in the [Safe FFI Wrapper exercise](../../unsafe-rust/" +"exercise.md)." msgstr "" -"Ми вже бачили це у [вправі Safe FFI Wrapper](../../exercises/day-3/safe-ffi-" -"wrapper.md)." +"Ми вже бачили це у [вправі Safe FFI Wrapper](../../unsafe-rust/exercise.md)." #: src/android/interoperability/with-c.md:24 msgid "" @@ -15359,11 +15494,11 @@ msgstr "" #: src/chromium/build-rules/vscode.md:32 msgid "" -"Demo **type annotations** (there are quote a few nice examples in the " +"Demo **type annotations** (there are quite a few nice examples in the " "`QrCode::with_bits` method)" msgstr "" "Продемонструйте **type annotations** (у методі `QrCode::with_bits` наведено " -"декілька гарних прикладів" +"декілька гарних прикладів)" #: src/chromium/build-rules/vscode.md:35 msgid "" @@ -16374,8 +16509,8 @@ msgstr "" #: src/exercises/chromium/interoperability-with-cpp.md:27 msgid "" -"You may also need to `#include \"third_party/rust/cxx/v1/crate/include/cxx." -"h\"`" +"You may also need to `#include \"third_party/rust/cxx/v1/crate/include/cxx.h" +"\"`" msgstr "" "Вам також може знадобитися `#include \"third_party/rust/cxx/v1/crate/include/" "cxx.h\"`" @@ -16966,8 +17101,8 @@ msgstr "А саме," msgid "" "```bob\n" " +------------+ +----------------------+\n" -"\"//third_party/rust\" | crate name | \"/v\" | major semver version | \":" -"lib\"\n" +"\"//third_party/rust\" | crate name | \"/v\" | major semver version | \":lib" +"\"\n" " +------------+ +----------------------+\n" "```" msgstr "" @@ -19789,13 +19924,13 @@ msgstr "vmbase" #: src/bare-metal/android/vmbase.md:3 msgid "" "For VMs running under crosvm on aarch64, the [vmbase](https://android." -"googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/" -"master/vmbase/) library provides a linker script and useful defaults for the " -"build rules, along with an entry point, UART console logging and more." +"googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/main/" +"libs/libvmbase/) library provides a linker script and useful defaults for " +"the build rules, along with an entry point, UART console logging and more." msgstr "" "Для віртуальних машин, що працюють під керуванням crosvm на aarch64, " -"бібліотека [vmbase](https://android.googlesource.com/platform/packages/" -"modules/Virtualization/+/refs/heads/master/vmbase/) надає сценарій " +"бібліотека [vmbase](googlesource.com/platform/packages/modules/" +"Virtualization/+/refs/heads/main/libs/libvmbase/) надає сценарій " "компонування та корисні параметри за замовчуванням для правил збірки разом " "із точкою входу, журналювання консолі UART тощо." @@ -20213,28 +20348,32 @@ msgid "\"Main thread: {i}\"" msgstr "\"Головний потік: {i}\"" #: src/concurrency/threads/plain.md:28 -msgid "Threads are all daemon threads, the main thread does not wait for them." -msgstr "Усі потоки є потоками-демонами, головний потік не чекає на них." +msgid "" +"Spawning new threads does not automatically delay program termination at the " +"end of `main`." +msgstr "" +"Породження нових потоків не призводить до автоматичної затримки завершення " +"програми в кінці `main`." -#: src/concurrency/threads/plain.md:29 +#: src/concurrency/threads/plain.md:30 msgid "Thread panics are independent of each other." msgstr "Паніка потоків не залежить одна від одної." -#: src/concurrency/threads/plain.md:30 +#: src/concurrency/threads/plain.md:31 msgid "Panics can carry a payload, which can be unpacked with `downcast_ref`." msgstr "" "Паніки можуть нести корисне навантаження, яке можна розпакувати за допомогою " "`downcast_ref`." -#: src/concurrency/threads/plain.md:34 +#: src/concurrency/threads/plain.md:35 msgid "Rust thread APIs look not too different from e.g. C++ ones." msgstr "API потоків Rust зовні не надто відрізняються від API, наприклад, C++." -#: src/concurrency/threads/plain.md:36 +#: src/concurrency/threads/plain.md:37 msgid "Run the example." msgstr "Запустіть приклад." -#: src/concurrency/threads/plain.md:37 +#: src/concurrency/threads/plain.md:38 msgid "" "5ms timing is loose enough that main and spawned threads stay mostly in " "lockstep." @@ -20242,13 +20381,13 @@ msgstr "" "Таймінг 5 мс є достатньо вільним, щоб головний і породжений потоки " "залишалися переважно в одному ритмі." -#: src/concurrency/threads/plain.md:39 +#: src/concurrency/threads/plain.md:40 msgid "Notice that the program ends before the spawned thread reaches 10!" msgstr "" "Зверніть увагу, що програма завершується до того, як породжений потік " "досягне 10!" -#: src/concurrency/threads/plain.md:40 +#: src/concurrency/threads/plain.md:41 msgid "" "This is because main ends the program and spawned threads do not make it " "persist." @@ -20256,15 +20395,15 @@ msgstr "" "Це тому, що main завершує програму, а породжені потоки не змушують її " "продовжувати." -#: src/concurrency/threads/plain.md:42 +#: src/concurrency/threads/plain.md:43 msgid "Compare to pthreads/C++ std::thread/boost::thread if desired." msgstr "За бажанням можна порівняти з pthreads/C++ std::thread/boost::thread." -#: src/concurrency/threads/plain.md:44 +#: src/concurrency/threads/plain.md:45 msgid "How do we wait around for the spawned thread to complete?" msgstr "Як нам дочекатися завершення породженого потоку?" -#: src/concurrency/threads/plain.md:45 +#: src/concurrency/threads/plain.md:46 msgid "" "[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html) " "returns a `JoinHandle`. Look at the docs." @@ -20272,7 +20411,7 @@ msgstr "" "[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html) " "повертає `JoinHandle`. Перегляньте документацію." -#: src/concurrency/threads/plain.md:46 +#: src/concurrency/threads/plain.md:47 msgid "" "`JoinHandle` has a [`.join()`](https://doc.rust-lang.org/std/thread/struct." "JoinHandle.html#method.join) method that blocks." @@ -20280,7 +20419,7 @@ msgstr "" "У `JoinHandle` є метод [`.join()`](https://doc.rust-lang.org/std/thread/" "struct.JoinHandle.html#method.join), який блокує." -#: src/concurrency/threads/plain.md:48 +#: src/concurrency/threads/plain.md:49 msgid "" "Use `let handle = thread::spawn(...)` and later `handle.join()` to wait for " "the thread to finish and have the program count all the way to 10." @@ -20288,15 +20427,15 @@ msgstr "" "Використовуйте `let handle = thread::spawn(...)`, а потім `handle.join()`, " "щоб дочекатися завершення потоку і змусити програму дорахувати до 10.." -#: src/concurrency/threads/plain.md:51 +#: src/concurrency/threads/plain.md:52 msgid "Now what if we want to return a value?" msgstr "А що, якщо ми хочемо повернути значення?" -#: src/concurrency/threads/plain.md:52 +#: src/concurrency/threads/plain.md:53 msgid "Look at docs again:" msgstr "Перегляньте документацію ще раз:" -#: src/concurrency/threads/plain.md:53 +#: src/concurrency/threads/plain.md:54 msgid "" "[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html)'s " "closure returns `T`" @@ -20304,7 +20443,7 @@ msgstr "" "Закриття [`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn." "html) повертає `T`." -#: src/concurrency/threads/plain.md:54 +#: src/concurrency/threads/plain.md:55 msgid "" "`JoinHandle` [`.join()`](https://doc.rust-lang.org/std/thread/struct." "JoinHandle.html#method.join) returns `thread::Result`" @@ -20312,7 +20451,7 @@ msgstr "" "`JoinHandle` [`.join()`](https://doc.rust-lang.org/std/thread/struct." "JoinHandle.html#method.join) повертає `thread::Result`" -#: src/concurrency/threads/plain.md:56 +#: src/concurrency/threads/plain.md:57 msgid "" "Use the `Result` return value from `handle.join()` to get access to the " "returned value." @@ -20320,15 +20459,15 @@ msgstr "" "Використовуйте значення `Result`, що повертається з `handle.join()`, щоб " "отримати доступ до значення, що повертається." -#: src/concurrency/threads/plain.md:59 +#: src/concurrency/threads/plain.md:60 msgid "Ok, what about the other case?" msgstr "Гаразд, а як щодо іншого випадку?" -#: src/concurrency/threads/plain.md:60 +#: src/concurrency/threads/plain.md:61 msgid "Trigger a panic in the thread. Note that this doesn't panic `main`." msgstr "Викликає паніку в потоці. Зауважте, що це не впливає на `main`." -#: src/concurrency/threads/plain.md:61 +#: src/concurrency/threads/plain.md:62 msgid "" "Access the panic payload. This is a good time to talk about [`Any`](https://" "doc.rust-lang.org/std/any/index.html)." @@ -20336,31 +20475,31 @@ msgstr "" "Дає доступ до корисного навантаження паніки. Це гарний час, щоб поговорити " "про [`Any`](https://doc.rust-lang.org/std/any/index.html)." -#: src/concurrency/threads/plain.md:63 +#: src/concurrency/threads/plain.md:64 msgid "Now we can return values from threads! What about taking inputs?" msgstr "" "Тепер ми можемо повертати значення з потоків! А як щодо отримання вхідних " "даних?" -#: src/concurrency/threads/plain.md:64 +#: src/concurrency/threads/plain.md:65 msgid "Capture something by reference in the thread closure." msgstr "Захоплюємо щось за посиланням у закритті потоку." -#: src/concurrency/threads/plain.md:65 +#: src/concurrency/threads/plain.md:66 msgid "An error message indicates we must move it." msgstr "Повідомлення про помилку вказує на те, що ми повинні його перемістити." -#: src/concurrency/threads/plain.md:66 +#: src/concurrency/threads/plain.md:67 msgid "Move it in, see we can compute and then return a derived value." msgstr "" "Переміщуємо його, бачимо, що можемо обчислити, а потім повертаємо похідне " "значення." -#: src/concurrency/threads/plain.md:68 +#: src/concurrency/threads/plain.md:69 msgid "If we want to borrow?" msgstr "Якщо ми хочемо позичити?" -#: src/concurrency/threads/plain.md:69 +#: src/concurrency/threads/plain.md:70 msgid "" "Main kills child threads when it returns, but another function would just " "return and leave them running." @@ -20368,12 +20507,12 @@ msgstr "" "Main вбиває дочірні потоки, коли повертається, але інша функція просто " "повернеться і залишить їх працювати." -#: src/concurrency/threads/plain.md:71 +#: src/concurrency/threads/plain.md:72 msgid "That would be stack use-after-return, which violates memory safety!" msgstr "" "Це буде використання стеку після повернення, що порушує безпеку пам'яті!" -#: src/concurrency/threads/plain.md:72 +#: src/concurrency/threads/plain.md:73 msgid "How do we avoid this? see next slide." msgstr "Як цього уникнути? Дивіться наступний слайд." @@ -20697,27 +20836,32 @@ msgstr "`!Send + Sync`" #: src/concurrency/send-sync/examples.md:33 msgid "" -"These types are thread-safe, but they cannot be moved to another thread:" -msgstr "Ці типи є потокобезпечними, але їх не можна перемістити в інший потік:" +"These types are safe to access (via shared references) from multiple " +"threads, but they cannot be moved to another thread:" +msgstr "" +"До цих типів можна безпечно отримати доступ (через спільні посилання) з " +"декількох потоків, але їх не можна перемістити в інший потік:" -#: src/concurrency/send-sync/examples.md:35 +#: src/concurrency/send-sync/examples.md:36 msgid "" "`MutexGuard`: Uses OS level primitives which must be deallocated on " -"the thread which created them." +"the thread which created them. However, an already-locked mutex can have its " +"guarded variable read by any thread with which the guard is shared." msgstr "" -"`MutexGuard`: використовує примітиви рівня ОС, які мають бути " -"звільнені в потоці, який їх створив." +"`MutexGuard`: Використовує примітиви рівня ОС, які мають бути " +"звільнені у потоці, що їх створив. Проте, вже заблокований м'ютекс може мати " +"захищену змінну, яку може читати будь-який потік, з яким розділяється захист." -#: src/concurrency/send-sync/examples.md:38 +#: src/concurrency/send-sync/examples.md:40 msgid "`!Send + !Sync`" msgstr "`!Send + !Sync`" -#: src/concurrency/send-sync/examples.md:40 +#: src/concurrency/send-sync/examples.md:42 msgid "These types are not thread-safe and cannot be moved to other threads:" msgstr "" "Ці типи є потоконебезпечними і не можуть бути переміщені в інші потоки:" -#: src/concurrency/send-sync/examples.md:42 +#: src/concurrency/send-sync/examples.md:44 msgid "" "`Rc`: each `Rc` has a reference to an `RcBox`, which contains a non-" "atomic reference count." @@ -20725,7 +20869,7 @@ msgstr "" "`Rc`: кожен `Rc` має посилання на `RcBox`, який містить " "неатомарний лічильник посилань." -#: src/concurrency/send-sync/examples.md:44 +#: src/concurrency/send-sync/examples.md:46 msgid "" "`*const T`, `*mut T`: Rust assumes raw pointers may have special concurrency " "considerations." @@ -20796,12 +20940,12 @@ msgid "" "[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) ensures " "mutual exclusion _and_ allows mutable access to `T` behind a read-only " "interface (another form of [interior mutability](../../borrowing/interior-" -"mutability)):" +"mutability.md)):" msgstr "" "[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) " "забезпечує взаємовиключення _та_ дозволяє мутабельний доступ до `T` за " "інтерфейсом лише для читання (інша форма [внутрішньої мутабельності](../../" -"borrowing/interior-mutability)):" +"borrowing/interior-mutability.md)):" #: src/concurrency/shared-state/mutex.md:16 #: src/concurrency/shared-state/mutex.md:23 @@ -20858,11 +21002,11 @@ msgstr "Чому `lock()` повертає `Result`?" #: src/concurrency/shared-state/mutex.md:46 msgid "" -"If the thread that held the `Mutex` panicked, the `Mutex` becomes " -"\"poisoned\" to signal that the data it protected might be in an " -"inconsistent state. Calling `lock()` on a poisoned mutex fails with a " -"[`PoisonError`](https://doc.rust-lang.org/std/sync/struct.PoisonError.html). " -"You can call `into_inner()` on the error to recover the data regardless." +"If the thread that held the `Mutex` panicked, the `Mutex` becomes \"poisoned" +"\" to signal that the data it protected might be in an inconsistent state. " +"Calling `lock()` on a poisoned mutex fails with a [`PoisonError`](https://" +"doc.rust-lang.org/std/sync/struct.PoisonError.html). You can call " +"`into_inner()` on the error to recover the data regardless." msgstr "" "Якщо потік, який утримував `Mutex`, запанікував, `Mutex` стає \"отруєним\", " "сигналізуючи про те, що дані, які він захищає, можуть перебувати в " @@ -20973,61 +21117,60 @@ msgid "\"Eureka! {} has a new idea!\"" msgstr "\"Еврика! {} має нову ідею!\"" #: src/concurrency/sync-exercises/dining-philosophers.md:45 -#: src/concurrency/async-exercises/solutions.md:35 msgid "// Pick up forks...\n" msgstr "// Беремо виделки...\n" #: src/concurrency/sync-exercises/dining-philosophers.md:46 #: src/concurrency/sync-exercises/solutions.md:35 #: src/concurrency/async-exercises/dining-philosophers.md:42 -#: src/concurrency/async-exercises/solutions.md:55 +#: src/concurrency/async-exercises/solutions.md:38 msgid "\"{} is eating...\"" msgstr "\"{} їсть...\"" #: src/concurrency/sync-exercises/dining-philosophers.md:52 #: src/concurrency/sync-exercises/solutions.md:41 #: src/concurrency/async-exercises/dining-philosophers.md:48 -#: src/concurrency/async-exercises/solutions.md:63 +#: src/concurrency/async-exercises/solutions.md:46 msgid "\"Socrates\"" msgstr "\"Сократ\"" #: src/concurrency/sync-exercises/dining-philosophers.md:52 #: src/concurrency/sync-exercises/solutions.md:41 #: src/concurrency/async-exercises/dining-philosophers.md:48 -#: src/concurrency/async-exercises/solutions.md:63 +#: src/concurrency/async-exercises/solutions.md:46 msgid "\"Hypatia\"" msgstr "\"Гіпатія\"" #: src/concurrency/sync-exercises/dining-philosophers.md:52 #: src/concurrency/sync-exercises/solutions.md:41 #: src/concurrency/async-exercises/dining-philosophers.md:48 -#: src/concurrency/async-exercises/solutions.md:63 +#: src/concurrency/async-exercises/solutions.md:46 msgid "\"Plato\"" msgstr "\"Платоне\"" #: src/concurrency/sync-exercises/dining-philosophers.md:52 #: src/concurrency/sync-exercises/solutions.md:41 #: src/concurrency/async-exercises/dining-philosophers.md:48 -#: src/concurrency/async-exercises/solutions.md:63 +#: src/concurrency/async-exercises/solutions.md:46 msgid "\"Aristotle\"" msgstr "\"Аристотель\"" #: src/concurrency/sync-exercises/dining-philosophers.md:52 #: src/concurrency/sync-exercises/solutions.md:41 #: src/concurrency/async-exercises/dining-philosophers.md:48 -#: src/concurrency/async-exercises/solutions.md:63 +#: src/concurrency/async-exercises/solutions.md:46 msgid "\"Pythagoras\"" msgstr "\"Піфагор\"" #: src/concurrency/sync-exercises/dining-philosophers.md:55 #: src/concurrency/async-exercises/dining-philosophers.md:52 -#: src/concurrency/async-exercises/solutions.md:67 +#: src/concurrency/async-exercises/solutions.md:50 msgid "// Create forks\n" msgstr "// Створюємо виделки\n" #: src/concurrency/sync-exercises/dining-philosophers.md:57 #: src/concurrency/async-exercises/dining-philosophers.md:54 -#: src/concurrency/async-exercises/solutions.md:71 +#: src/concurrency/async-exercises/solutions.md:54 msgid "// Create philosophers\n" msgstr "// Створюємо філософів\n" @@ -21037,7 +21180,7 @@ msgstr "// Змусимо кожного з них подумати і з'їст #: src/concurrency/sync-exercises/dining-philosophers.md:61 #: src/concurrency/async-exercises/dining-philosophers.md:58 -#: src/concurrency/async-exercises/solutions.md:99 +#: src/concurrency/async-exercises/solutions.md:85 msgid "// Output their thoughts\n" msgstr "// Вивести свої думки\n" @@ -21115,8 +21258,8 @@ msgid "" "publish = false\n" "\n" "[dependencies]\n" -"reqwest = { version = \"0.11.12\", features = [\"blocking\", \"rustls-" -"tls\"] }\n" +"reqwest = { version = \"0.11.12\", features = [\"blocking\", \"rustls-tls" +"\"] }\n" "scraper = \"0.13.0\"\n" "thiserror = \"1.0.37\"\n" "```" @@ -21129,8 +21272,8 @@ msgstr "" "publish = false\n" "\n" "[dependencies]\n" -"reqwest = { version = \"0.11.12\", features = [\"blocking\", \"rustls-" -"tls\"] }\n" +"reqwest = { version = \"0.11.12\", features = [\"blocking\", \"rustls-tls" +"\"] }\n" "scraper = \"0.13.0\"\n" "thiserror = \"1.0.37\"\n" "```" @@ -21813,70 +21956,41 @@ msgstr "" "виконується `statement` з отриманими змінними. Результат `statement` стає " "результатом макросу `select!`." -#: src/concurrency/async-control-flow/select.md:44 -msgid "\"Felix\"" -msgstr "\"Фелікс\"" - -#: src/concurrency/async-control-flow/select.md:44 -msgid "\"Failed to send cat.\"" -msgstr "\"Не вдалося відправити кота.\"" - -#: src/concurrency/async-control-flow/select.md:48 -msgid "\"Failed to send dog.\"" -msgstr "\"Не вдалося відправити собаку.\"" - -#: src/concurrency/async-control-flow/select.md:53 -msgid "\"Failed to receive winner\"" -msgstr "\"Не вдалося отримати переможця\"" +#: src/concurrency/async-control-flow/select.md:27 +msgid "\"got: {msg}\"" +msgstr "\"отримав: {msg}\"" -#: src/concurrency/async-control-flow/select.md:55 -msgid "\"Winner is {winner:?}\"" -msgstr "\"Переможцем стає {winner:?}\"" +#: src/concurrency/async-control-flow/select.md:28 +msgid "\"timeout\"" +msgstr "\"тайм-аут\"" -#: src/concurrency/async-control-flow/select.md:61 -msgid "" -"In this example, we have a race between a cat and a dog. " -"`first_animal_to_finish_race` listens to both channels and will pick " -"whichever arrives first. Since the dog takes 50ms, it wins against the cat " -"that take 500ms." -msgstr "" -"У цьому прикладі ми маємо перегони між котом і собакою. " -"`first_animal_to_finish_race` слухає обидва канали та вибере того, який " -"прибуде першим. Оскільки собаці потрібно 50 мс, вона виграє у кота, якому " -"потрібно 500 мс." - -#: src/concurrency/async-control-flow/select.md:66 -msgid "" -"You can use `oneshot` channels in this example as the channels are supposed " -"to receive only one `send`." -msgstr "" -"У цьому прикладі ви можете використовувати канали `oneshot`, оскільки канали " -"мають отримувати лише один `send`." +#: src/concurrency/async-control-flow/select.md:32 +msgid "\"Failed to send greeting\"" +msgstr "\"Не вдалося надіслати привітання.\"" -#: src/concurrency/async-control-flow/select.md:69 -msgid "" -"Try adding a deadline to the race, demonstrating selecting different sorts " -"of futures." -msgstr "" -"Спробуйте додати дедлайн до перегонів, продемонструвавши вибір різних видів " -"ф’ючерсів." +#: src/concurrency/async-control-flow/select.md:34 +msgid "\"Listener failed\"" +msgstr "\"Listener зазнав невдачі\"" -#: src/concurrency/async-control-flow/select.md:72 +#: src/concurrency/async-control-flow/select.md:40 msgid "" -"Note that `select!` drops unmatched branches, which cancels their futures. " -"It is easiest to use when every execution of `select!` creates new futures." +"The `listener` async block here is a common form: wait for some async event, " +"or for a timeout. Change the `sleep` to sleep longer to see it fail. Why " +"does the `send` also fail in this situation?" msgstr "" -"Зауважте, що `select!` відкидає непорівнянні гілки, що скасовує їхні " -"ф’ючерси. Його найлегше використовувати, коли кожне виконання команди " -"`select!` створює нові ф’ючерси." +"Блок асинхронізації `listener` тут є звичайною формою: очікування деякої " +"асинхронної події або таймауту. Змініть `sleep` на довший час, щоб побачити, " +"що він не спрацює. Чому в цій ситуації також не спрацьовує `send`?" -#: src/concurrency/async-control-flow/select.md:75 +#: src/concurrency/async-control-flow/select.md:44 msgid "" -"An alternative is to pass `&mut future` instead of the future itself, but " -"this can lead to issues, further discussed in the pinning slide." +"`select!` is also often used in a loop in \"actor\" architectures, where a " +"task reacts to events in a loop. That has some pitfalls, which will be " +"discussed in the next segment." msgstr "" -"Альтернативою є передача `&mut future` замість самого ф’ючерса, але це може " -"призвести до проблем, які далі обговорюються на слайді про закріплення." +"Команда `select!` також часто використовується у циклі в \"actor\" " +"архітектурах, де завдання реагує на події у циклі. Це має деякі підводні " +"камені, які буде обговорено у наступному розділі." #: src/concurrency/async-pitfalls.md msgid "" @@ -22341,11 +22455,11 @@ msgstr "Вечеря філософів --- Async" #: src/concurrency/async-exercises/dining-philosophers.md:7 msgid "" -"See [dining philosophers](concurrency/sync-exercises/dining-philosophers.md) " -"for a description of the problem." +"See [dining philosophers](../sync-exercises/dining-philosophers.md) for a " +"description of the problem." msgstr "" -"Перегляньте [вечерю філософів](concurrency/sync-exercises/dining-" -"philosophers.md) для опису проблеми." +"Перегляньте [вечерю філософів](../sync-exercises/dining-philosophers.md) для " +"опису проблеми." #: src/concurrency/async-exercises/dining-philosophers.md:10 msgid "" @@ -22359,12 +22473,11 @@ msgstr "" "перевірте, чи `cargo run` не блокує:" #: src/concurrency/async-exercises/dining-philosophers.md:41 -#: src/concurrency/async-exercises/solutions.md:33 msgid "// Keep trying until we have both forks\n" msgstr "// Продовжуємо пробувати, поки не знайдемо обидві виделки\n" #: src/concurrency/async-exercises/dining-philosophers.md:56 -#: src/concurrency/async-exercises/solutions.md:89 +#: src/concurrency/async-exercises/solutions.md:75 msgid "// Make them think and eat\n" msgstr "// Змусимо їх думати і їсти\n" @@ -22447,24 +22560,11 @@ msgid "" "[dependencies]\n" "futures-util = { version = \"0.3.30\", features = [\"sink\"] }\n" "http = \"1.1.0\"\n" -"tokio = { version = \"1.38.0\", features = [\"full\"] }\n" -"tokio-websockets = { version = \"0.8.3\", features = [\"client\", " -"\"fastrand\", \"server\", \"sha1_smol\"] }\n" +"tokio = { version = \"1.40.0\", features = [\"full\"] }\n" +"tokio-websockets = { version = \"0.9.0\", features = [\"client\", \"fastrand" +"\", \"server\", \"sha1_smol\"] }\n" "```" msgstr "" -"```toml\n" -"[package]\n" -"name = \"chat-async\"\n" -"version = \"0.1.0\"\n" -"edition = \"2021\"\n" -"\n" -"[dependencies]\n" -"futures-util = { version = \"0.3.30\", features = [\"sink\"] }\n" -"http = \"1.1.0\"\n" -"tokio = { version = \"1.38.0\", features = [\"full\"] }\n" -"tokio-websockets = { version = \"0.8.3\", features = [\"client\", " -"\"fastrand\", \"server\", \"sha1_smol\"] }\n" -"```" #: src/concurrency/async-exercises/chat-app.md:35 msgid "The required APIs" @@ -22551,7 +22651,7 @@ msgstr "" "описано нижче." #: src/concurrency/async-exercises/chat-app.md:62 -#: src/concurrency/async-exercises/solutions.md:108 +#: src/concurrency/async-exercises/solutions.md:94 msgid "_src/bin/server.rs_:" msgstr "_src/bin/server.rs_:" @@ -22561,32 +22661,32 @@ msgid "// TODO: For a hint, see the description of the task below.\n" msgstr "// TODO: Підказку дивіться в описі завдання нижче.\n" #: src/concurrency/async-exercises/chat-app.md:89 -#: src/concurrency/async-exercises/solutions.md:158 +#: src/concurrency/async-exercises/solutions.md:144 msgid "\"127.0.0.1:2000\"" msgstr "\"127.0.0.1:2000\"" #: src/concurrency/async-exercises/chat-app.md:90 -#: src/concurrency/async-exercises/solutions.md:159 +#: src/concurrency/async-exercises/solutions.md:145 msgid "\"listening on port 2000\"" msgstr "\"слухаємо на порту 2000\"" #: src/concurrency/async-exercises/chat-app.md:94 -#: src/concurrency/async-exercises/solutions.md:163 +#: src/concurrency/async-exercises/solutions.md:149 msgid "\"New connection from {addr:?}\"" msgstr "\"Нове з'єднання з {addr:?}\"" #: src/concurrency/async-exercises/chat-app.md:97 -#: src/concurrency/async-exercises/solutions.md:166 +#: src/concurrency/async-exercises/solutions.md:152 msgid "// Wrap the raw TCP stream into a websocket.\n" msgstr "// Обернути необроблений TCP потік у веб-сокет.\n" #: src/concurrency/async-exercises/chat-app.md:106 -#: src/concurrency/async-exercises/solutions.md:175 +#: src/concurrency/async-exercises/solutions.md:161 msgid "_src/bin/client.rs_:" msgstr "_src/bin/client.rs_:" #: src/concurrency/async-exercises/chat-app.md:120 -#: src/concurrency/async-exercises/solutions.md:187 +#: src/concurrency/async-exercises/solutions.md:173 msgid "\"ws://127.0.0.1:2000\"" msgstr "\"ws://127.0.0.1:2000\"" @@ -22641,40 +22741,32 @@ msgstr "" "Необов’язково: коли ви закінчите, змініть код, щоб транслювати повідомлення " "всім клієнтам, крім відправника повідомлення." -#: src/concurrency/async-exercises/solutions.md:39 -msgid "" -"// If we didn't get the left fork, drop the right fork if we\n" -" // have it and let other tasks make progress.\n" -msgstr "" -"// Якщо ми не отримали ліву виделку, кидаємо праву, якщо вона у нас є,\n" -" // і даємо можливість іншим завданням просуватися вперед.\n" - -#: src/concurrency/async-exercises/solutions.md:46 +#: src/concurrency/async-exercises/solutions.md:33 msgid "" -"// If we didn't get the right fork, drop the left fork and let\n" -" // other tasks make progress.\n" +"// Keep trying until we have both forks\n" +" // Pick up forks...\n" msgstr "" -"// Якщо ми не отримали правої виделки, кидаємо ліву і даємо можливість \n" -" // іншим завданням просуватися вперед.\n" +"// Продовжуємо пробувати, поки не знайдемо обидві виделки\n" +" // Беремо виделки...\n" -#: src/concurrency/async-exercises/solutions.md:58 +#: src/concurrency/async-exercises/solutions.md:41 msgid "// The locks are dropped here\n" msgstr "// Тут скидаються блокування\n" -#: src/concurrency/async-exercises/solutions.md:86 +#: src/concurrency/async-exercises/solutions.md:72 msgid "// tx is dropped here, so we don't need to explicitly drop it later\n" msgstr "" "// tx відкидається тут, тому нам не потрібно явно відкидати його пізніше\n" -#: src/concurrency/async-exercises/solutions.md:101 +#: src/concurrency/async-exercises/solutions.md:87 msgid "\"Here is a thought: {thought}\"" msgstr "\"Є така думка: {thought}\"" -#: src/concurrency/async-exercises/solutions.md:126 +#: src/concurrency/async-exercises/solutions.md:112 msgid "\"Welcome to chat! Type a message\"" msgstr "\"Ласкаво просимо до чату! Введіть повідомлення\"" -#: src/concurrency/async-exercises/solutions.md:130 +#: src/concurrency/async-exercises/solutions.md:116 msgid "" "// A continuous loop for concurrently performing two tasks: (1) receiving\n" " // messages from `ws_stream` and broadcasting them, and (2) receiving\n" @@ -22684,16 +22776,16 @@ msgstr "" " // повідомлень з `ws_stream` та їх трансляції, та (2) отримання\n" " // повідомлень на `bcast_rx` і відправлення їх клієнту.\n" -#: src/concurrency/async-exercises/solutions.md:139 +#: src/concurrency/async-exercises/solutions.md:125 msgid "\"From client {addr:?} {text:?}\"" msgstr "\"Від клієнта {addr:?} {text:?}\"" -#: src/concurrency/async-exercises/solutions.md:194 +#: src/concurrency/async-exercises/solutions.md:180 msgid "// Continuous loop for concurrently sending and receiving messages.\n" msgstr "" "// Безперервний цикл для одночасної відправки та отримання повідомлень.\n" -#: src/concurrency/async-exercises/solutions.md:201 +#: src/concurrency/async-exercises/solutions.md:187 msgid "\"From server: {}\"" msgstr "\"З сервера: {}\"" @@ -22703,8 +22795,8 @@ msgstr "course: none" #: src/thanks.md msgid "" -"_Thank you for taking Comprehensive Rust 🦀!_ We hope you enjoyed it and " -"that it was useful." +"_Thank you for taking Comprehensive Rust 🦀!_ We hope you enjoyed it and that " +"it was useful." msgstr "" "_Дякуємо, що прослухали курс Comprehensive Rust 🦀!_ Сподіваємося, вам " "сподобалось і було корисно." @@ -22735,10 +22827,10 @@ msgstr "" #: src/glossary.md msgid "" "allocate: \n" -"Dynamic memory allocation on [the heap](memory-management/stack-vs-heap.md)." +"Dynamic memory allocation on [the heap](memory-management/review.md)." msgstr "" "виділяти: \n" -"Динамічний розподіл пам'яті на [купі](memory-management/stack-vs-heap.md)." +"Динамічний розподіл пам'яті на [купі](memory-management/review.md)." #: src/glossary.md msgid "" @@ -22748,6 +22840,16 @@ msgstr "" "аргумент: \n" "Інформація, яка передається у функцію або метод." +#: src/glossary.md +msgid "" +"associated type: \n" +"A type associated with a specific trait. Useful for defining the " +"relationship between types." +msgstr "" +"асоційований тип: \n" +"Тип, пов'язаний з певним трейтом. Корисний для визначення взаємозв'язку між " +"типами." + #: src/glossary.md msgid "" "Bare-metal Rust: \n" @@ -22762,18 +22864,19 @@ msgstr "" #: src/glossary.md msgid "" "block: \n" -"See [Blocks](control-flow/blocks.md) and _scope_." +"See [Blocks](control-flow-basics/blocks-and-scopes.md) and _scope_." msgstr "" "блок: \n" -"Дивіться [Блоки](control-flow/blocks.md) та _область видимості_." +"Дивіться [Блоки](control-flow-basics/blocks-and-scopes.md) та _область " +"видимості_." #: src/glossary.md msgid "" "borrow: \n" -"See [Borrowing](ownership/borrowing.md)." +"See [Borrowing](borrowing/shared.md)." msgstr "" "позичати: \n" -"Дивіться [Запозичення](ownership/borrowing.md." +"Дивіться [Запозичення](borrowing/shared.md)." #: src/glossary.md msgid "" @@ -22837,10 +22940,10 @@ msgstr "" #: src/glossary.md msgid "" "Concurrency in Rust: \n" -"See [Concurrency in Rust](concurrency.md)." +"See [Concurrency in Rust](concurrency/welcome.md)." msgstr "" "Одночасність виконання у Rust: \n" -"Дивіться [Одночасність виконання у Rust](concurrency.md)." +"Дивіться [Одночасність виконання у Rust](concurrency/welcome.md)." #: src/glossary.md msgid "" @@ -23346,11 +23449,11 @@ msgstr "" msgid "" "unsafe: \n" "The subset of Rust which allows you to trigger _undefined behavior_. See " -"[Unsafe Rust](unsafe.html)." +"[Unsafe Rust](unsafe-rust/unsafe.md)." msgstr "" "unsafe: \n" "Підмножина Rust, яка дозволяє викликати _невизначену поведінку_. Дивіться " -"[Небезпечний Rust](unsafe.html)." +"[Небезпечний Rust](unsafe-rust/unsafe.md)." #: src/glossary.md msgid "" @@ -23470,13 +23573,13 @@ msgstr "" #: src/other-resources.md msgid "" -"[Rust for Embedded C Programmers](https://docs.opentitan.org/doc/ug/" -"rust_for_c/): covers Rust from the perspective of developers who write " -"firmware in C." +"[Rust for Embedded C Programmers](https://opentitan.org/book/doc/" +"rust_for_c_devs.html): covers Rust from the perspective of developers who " +"write firmware in C." msgstr "" -"[Rust для Embedded C програмістів](https://docs.opentitan.org/doc/ug/" -"rust_for_c/): розповідається про Rust з точки зору розробників, які пишуть " -"вбудоване програмне забезпечення на C." +"[Rust для Embedded C програмістів](https://opentitan.org/book/doc/" +"rust_for_c_devs.html): розповідається про Rust з точки зору розробників, які " +"пишуть вбудоване програмне забезпечення на C." #: src/other-resources.md msgid "" @@ -23510,16 +23613,16 @@ msgstr "" #: src/other-resources.md msgid "" -"[Advanced testing for Rust applications](https://github.com/mainmatter/rust-" -"advanced-testing-workshop): a self-paced workshop that goes beyond Rust's " -"built-in testing framework. It covers `googletest`, snapshot testing, " -"mocking as well as how to write your own custom test harness." +"[Advanced testing for Rust applications](https://rust-exercises.com/advanced-" +"testing/): a self-paced workshop that goes beyond Rust's built-in testing " +"framework. It covers `googletest`, snapshot testing, mocking as well as how " +"to write your own custom test harness." msgstr "" -"[Розширене тестування для прикладних програм Rust](https://github.com/" -"mainmatter/rust-advanced-testing-workshop): воркшоп для самостійної роботи, " -"який виходить за рамки вбудованого тестового фреймворку Rust. Він охоплює " -"`googletest`, тестування знімками, імітацію, а також те, як написати свій " -"власний тестовий інструментарій." +"[Розширене тестування для прикладних програм Rust](https://rust-exercises." +"com/advanced-testing/): воркшоп для самостійної роботи, який виходить за " +"рамки вбудованого тестового фреймворку Rust. Він охоплює `googletest`, " +"тестування знімками, імітацію, а також те, як написати свій власний тестовий " +"інструментарій." #: src/other-resources.md msgid "" @@ -23618,6 +23721,216 @@ msgstr "" "каталог `third_party/cxx/` для отримання детальної інформації, включно з " "умовами ліцензії." +#~ msgid "Slices: `&[T]`" +#~ msgstr "Зрізи: `&[T]`" + +#~ msgid "`thiserror` and `anyhow`" +#~ msgstr "`thiserror` та `anyhow`" + +#~ msgid "" +#~ "Question: What happens if you modify `a[3]` right before printing `s`?" +#~ msgstr "" +#~ "Запитання: що станеться, якщо змінити `a[3]` безпосередньо перед друком " +#~ "`s`?" + +#~ msgid "" +#~ "The question about modifying `a[3]` can spark an interesting discussion, " +#~ "but the answer is that for memory safety reasons you cannot do it through " +#~ "`a` at this point in the execution, but you can read the data from both " +#~ "`a` and `s` safely. It works before you created the slice, and again " +#~ "after the `println`, when the slice is no longer used." +#~ msgstr "" +#~ "Питання про модифікацію `a[3]` може викликати цікаву дискусію, але " +#~ "відповідь полягає в тому, що з міркувань безпеки пам’яті ви не можете " +#~ "зробити це через `a` на цьому етапі виконання, але ви можете читати дані " +#~ "з обох `a ` і `s` безпечно. Це спрацьовує до того, як ви створили зріз, і " +#~ "знову після `println`, коли зріз більше не використовується." + +#~ msgid "" +#~ "Save the result of `divide_in_two` in the `result` variable and `match` " +#~ "it in a loop. That won't compile because `msg` is consumed when matched. " +#~ "To fix it, match `&result` instead of `result`. That will make `msg` a " +#~ "reference so it won't be consumed. This [\"match ergonomics\"](https://" +#~ "rust-lang.github.io/rfcs/2005-match-ergonomics.html) appeared in Rust " +#~ "2018. If you want to support older Rust, replace `msg` with `ref msg` in " +#~ "the pattern." +#~ msgstr "" +#~ "Збережіть результат `divide_in_two` у змінній `result` і `match` його у " +#~ "циклі. Це не буде скомпільовано, оскільки при порівнянні споживається " +#~ "`msg`. Щоб виправити це, порівняйте `&result` замість `result`. Це " +#~ "зробить `msg` посиланням, тому його не буде використано. Ця [\"ергономіка " +#~ "співставлення\"](https://rust-lang.github.io/rfcs/2005-match-ergonomics." +#~ "html) з'явилася у Rust 2018. Якщо ви хочете підтримувати попередні версії " +#~ "Rust, замініть `msg` на `ref msg` у шаблоні." + +#~ msgid "" +#~ "We are showing `HashMap`, and avoid using `&str` as key to " +#~ "make examples easier. Using references in collections can, of course, be " +#~ "done, but it can lead into complications with the borrow checker." +#~ msgstr "" +#~ "Ми показуємо `HashMap` і уникаємо використання `&str` як " +#~ "ключа, щоб полегшити приклади. Використання посилань у колекціях, " +#~ "звичайно, можливо, але це може призвести до ускладнень із перевіркою " +#~ "запозичень." + +#~ msgid "" +#~ "Try removing `to_string()` from the example above and see if it still " +#~ "compiles. Where do you think we might run into issues?" +#~ msgstr "" +#~ "Спробуйте видалити `to_string()` із прикладу вище та подивіться, чи він " +#~ "усе ще компілюється. Як ви думаєте, де ми можемо зіткнутися з проблемами?" + +#~ msgid "" +#~ "By default, closures will capture by reference if they can. The `move` " +#~ "keyword makes them capture by value." +#~ msgstr "" +#~ "За замовчуванням закриття захоплюють за посиланням, якщо це можливо. " +#~ "Ключове слово `move` змушує їх захоплювати за значенням." + +#~ msgid "\"Expected `i32` to be an `I32` field\"" +#~ msgstr "\"Очікувалося, що `i32` буде полем `I32`\"" + +#~ msgid "// Unwrap error because `value` is definitely 4 bytes long.\n" +#~ msgstr "" +#~ "// Помилка розгортання, оскільки `value` точно має довжину 4 байти.\n" + +#~ msgid "" +#~ "Make sure to implement the `std::error::Error` trait when defining a " +#~ "custom error type so it can be boxed. But if you need to support the " +#~ "`no_std` attribute, keep in mind that the `std::error::Error` trait is " +#~ "currently compatible with `no_std` in [nightly](https://github.com/rust-" +#~ "lang/rust/issues/103765) only." +#~ msgstr "" +#~ "Переконайтеся, що ви використовуєте ознаку `std::error::Error`, коли " +#~ "визначаєте користувацький тип помилки, щоб її можна було упакувати. Але " +#~ "якщо вам потрібно підтримувати атрибут `no_std`, майте на увазі, що " +#~ "ознака `std::error::Error` наразі сумісна з `no_std` лише у [nightly]" +#~ "(https://github.com/rust-lang/rust/issues/103765)." + +#~ msgid "" +#~ "The [`thiserror`](https://docs.rs/thiserror/) and [`anyhow`](https://docs." +#~ "rs/anyhow/) crates are widely used to simplify error handling." +#~ msgstr "" +#~ "Крейти [thiserror](https://docs.rs/thiserror/) та [`anyhow`](https://docs." +#~ "rs/anyhow/) широко використовуються для спрощення обробки помилок." + +#~ msgid "" +#~ "`thiserror` is often used in libraries to create custom error types that " +#~ "implement `From`." +#~ msgstr "" +#~ "`thiserror` часто використовується у бібліотеках для створення " +#~ "користувацьких типів помилок, які реалізують `From`." + +#~ msgid "" +#~ "`anyhow` is often used by applications to help with error handling in " +#~ "functions, including adding contextual information to your errors." +#~ msgstr "" +#~ "`anyhow` часто використовується програмами для полегшення обробки помилок " +#~ "у функціях, зокрема для додавання контекстної інформації до ваших помилок." + +#~ msgid "The `std::error::Error` trait is derived automatically." +#~ msgstr "Трейт `std::error::Error` виводиться автоматично." + +#~ msgid "" +#~ "Actual error type inside of it can be extracted for examination if " +#~ "necessary." +#~ msgstr "" +#~ "Фактичний тип помилки всередині нього можна вилучити для перевірки, якщо " +#~ "це необхідно." + +#~ msgid "" +#~ "There is a plan to transition [Android](https://source.android.com/docs/" +#~ "setup/build/bazel/introduction), [ChromeOS](https://chromium.googlesource." +#~ "com/chromiumos/bazel/), and [Fuchsia](https://source.android.com/docs/" +#~ "setup/build/bazel/introduction) to Bazel." +#~ msgstr "" +#~ "Існує план переходу [Android](https://source.android.com/docs/setup/build/" +#~ "bazel/introduction), [ChromeOS](https://chromium.googlesource.com/" +#~ "chromiumos/bazel/) та [Fuchsia](https://source.android.com/docs/setup/" +#~ "build/bazel/introduction) на Bazel." + +#~ msgid "" +#~ "Learning Bazel-like build rules is useful for all Rust OS developers." +#~ msgstr "" +#~ "Вивчення Bazel-подібних правил збірки корисно для всіх розробників Rust " +#~ "OS." + +#~ msgid "" +#~ "Threads are all daemon threads, the main thread does not wait for them." +#~ msgstr "Усі потоки є потоками-демонами, головний потік не чекає на них." + +#~ msgid "\"Felix\"" +#~ msgstr "\"Фелікс\"" + +#~ msgid "\"Failed to send cat.\"" +#~ msgstr "\"Не вдалося відправити кота.\"" + +#~ msgid "\"Failed to send dog.\"" +#~ msgstr "\"Не вдалося відправити собаку.\"" + +#~ msgid "\"Failed to receive winner\"" +#~ msgstr "\"Не вдалося отримати переможця\"" + +#~ msgid "\"Winner is {winner:?}\"" +#~ msgstr "\"Переможцем стає {winner:?}\"" + +#~ msgid "" +#~ "In this example, we have a race between a cat and a dog. " +#~ "`first_animal_to_finish_race` listens to both channels and will pick " +#~ "whichever arrives first. Since the dog takes 50ms, it wins against the " +#~ "cat that take 500ms." +#~ msgstr "" +#~ "У цьому прикладі ми маємо перегони між котом і собакою. " +#~ "`first_animal_to_finish_race` слухає обидва канали та вибере того, який " +#~ "прибуде першим. Оскільки собаці потрібно 50 мс, вона виграє у кота, якому " +#~ "потрібно 500 мс." + +#~ msgid "" +#~ "You can use `oneshot` channels in this example as the channels are " +#~ "supposed to receive only one `send`." +#~ msgstr "" +#~ "У цьому прикладі ви можете використовувати канали `oneshot`, оскільки " +#~ "канали мають отримувати лише один `send`." + +#~ msgid "" +#~ "Try adding a deadline to the race, demonstrating selecting different " +#~ "sorts of futures." +#~ msgstr "" +#~ "Спробуйте додати дедлайн до перегонів, продемонструвавши вибір різних " +#~ "видів ф’ючерсів." + +#~ msgid "" +#~ "Note that `select!` drops unmatched branches, which cancels their " +#~ "futures. It is easiest to use when every execution of `select!` creates " +#~ "new futures." +#~ msgstr "" +#~ "Зауважте, що `select!` відкидає непорівнянні гілки, що скасовує їхні " +#~ "ф’ючерси. Його найлегше використовувати, коли кожне виконання команди " +#~ "`select!` створює нові ф’ючерси." + +#~ msgid "" +#~ "An alternative is to pass `&mut future` instead of the future itself, but " +#~ "this can lead to issues, further discussed in the pinning slide." +#~ msgstr "" +#~ "Альтернативою є передача `&mut future` замість самого ф’ючерса, але це " +#~ "може призвести до проблем, які далі обговорюються на слайді про " +#~ "закріплення." + +#~ msgid "" +#~ "// If we didn't get the left fork, drop the right fork if we\n" +#~ " // have it and let other tasks make progress.\n" +#~ msgstr "" +#~ "// Якщо ми не отримали ліву виделку, кидаємо праву, якщо вона у нас є,\n" +#~ " // і даємо можливість іншим завданням просуватися " +#~ "вперед.\n" + +#~ msgid "" +#~ "// If we didn't get the right fork, drop the left fork and let\n" +#~ " // other tasks make progress.\n" +#~ msgstr "" +#~ "// Якщо ми не отримали правої виделки, кидаємо ліву і даємо можливість \n" +#~ " // іншим завданням просуватися вперед.\n" + #~ msgid "Conditionals" #~ msgstr "Умовні слова" @@ -26710,8 +27023,8 @@ msgstr "" #~ "Причиною цього є те, що функціональність стандартної бібліотеки не може " #~ "зникнути, тому вона має бути дуже стабільною. Для наведених вище " #~ "прикладів спільнота Rust все ще працює над пошуком найкращого рішення --- " -#~ "і, можливо, для деяких із цих речей не існує єдиного \"найкращого " -#~ "рішення\"." +#~ "і, можливо, для деяких із цих речей не існує єдиного \"найкращого рішення" +#~ "\"." #~ msgid "" #~ "Rust comes with a built-in package manager in the form of Cargo and this " @@ -27206,8 +27519,8 @@ msgstr "" #~ "The expression is matched against the patterns from top to bottom. There " #~ "is no fall-through like in C or C++." #~ msgstr "" -#~ "Вираз зіставляється із шаблонами зверху вниз. Немає провалів, як у C або " -#~ "C++." +#~ "Вираз зіставляється із шаблонами зверху вниз. Немає провалів, як у C або C" +#~ "++." #~ msgid "" #~ "The match expression has a value. The value is the last expression in the "