From 9968036e5cbfc9e6c22215a7004eb4b16559d4bc Mon Sep 17 00:00:00 2001 From: Alexander Andreev Date: Fri, 26 Jan 2024 07:28:47 +0000 Subject: [PATCH 1/4] Translate ch10-02-traits.md via GitLocalize --- rustbook-ru/src/ch10-02-traits.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/rustbook-ru/src/ch10-02-traits.md b/rustbook-ru/src/ch10-02-traits.md index 7f912e89a..dff345df7 100644 --- a/rustbook-ru/src/ch10-02-traits.md +++ b/rustbook-ru/src/ch10-02-traits.md @@ -12,13 +12,13 @@ Мы хотим создать крейт библиотеки медиа-агрегатора `aggregator`, которая может отображать сводку данных сохранённых в экземплярах структур `NewsArticle` или `Tweet`. Чтобы этого достичь, нам необходимо иметь возможность для каждой структуры получить короткую сводку на основе имеющихся данных, и для этого мы запросим сводку вызвав метод `summarize`. Листинг 10-12 показывает определение типажа `Summary`, который выражает это поведение. -Файл: src/lib.rs +Filename: src/lib.rs ```rust,noplayground {{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/listing-10-12/src/lib.rs}} ``` -Листинг 10-12: Определение типажа Summary, который содержит поведение предоставленное методом summarize +Listing 10-12: A Summary trait that consists of the behavior provided by a summarize method Здесь мы объявляем типаж с использованием ключевого слова `trait`, а затем его название, которым в нашем случае является `Summary`. Также мы объявляем крейт как `pub` что позволяет крейтам, зависящим от нашего крейта, тоже использовать наш крейт, что мы увидим в последующих примерах. Внутри фигурных скобок объявляются сигнатуры методов, которые описывают поведения типов, реализующих данный типаж, в данном случае поведение определяется только одной сигнатурой метода `fn summarize(&self) -> String`. @@ -30,7 +30,7 @@ Теперь, после того как мы определили желаемое поведение используя типаж `Summary`, можно реализовать его у типов в нашем медиа-агрегаторе. Листинг 10-13 показывает реализацию типажа `Summary` у структуры `NewsArticle`, которая использует для создания сводки в методе `summarize` заголовок, автора и место публикации статьи. Для структуры `Tweet` мы определяем реализацию `summarize` используя имя пользователя и следующий за ним полный текст твита, полагая что содержание твита уже ограничено 280 символами. -Файл: src/lib.rs +Filename: src/lib.rs ```rust,noplayground {{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/listing-10-13/src/lib.rs:here}} @@ -58,7 +58,7 @@ В примере 10-14 показано, как указать строку по умолчанию для метода `summarize` из типажа `Summary` вместо определения только сигнатуры метода, как мы сделали в примере 10-12. -Файл: src/lib.rs +Filename: src/lib.rs ```rust,noplayground {{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/listing-10-14/src/lib.rs:here}} @@ -190,11 +190,11 @@ fn some_function(t: &T, u: &U) -> i32 { {{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/no-listing-06-impl-trait-returns-one-type/src/lib.rs:here}} ``` -Возврат либо `NewsArticle` либо `Tweet` не допускается из-за ограничений того, как реализован синтаксис `impl Trait` в компиляторе. Мы рассмотрим, как написать функцию с таким поведением в разделе ["Использование объектов типажей, которые разрешены для значений или разных типов"] Главы 17. +Возврат либо `NewsArticle` либо `Tweet` не допускается из-за ограничений того, как реализован синтаксис `impl Trait` в компиляторе. Мы рассмотрим, как написать функцию с таким поведением в разделе ["Использование объектов типажей, которые разрешены для значений или разных типов"](ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types) Главы 17. ### Использование ограничений типажа для условной реализации методов -Используя ограничение типажа с блоком `impl`, который использует параметры обобщённого типа, можно реализовать методы условно, для тех типов, которые реализуют указанный типаж. Например, тип `Pair` в листинге 10-16 всегда реализует функцию `new` для возврата нового экземпляра `Pair` (вспомните раздел [“Определение методов”] Главы 5 где `Self` является псевдонимом типа для типа блока `impl`, который в данном случае является `Pair`). Но в следующем блоке `impl` тип `Pair` реализует метод `cmp_display` только если его внутренний тип `T` реализует типаж `PartialOrd` (позволяющий сравнивать) *и* типаж `Display` (позволяющий выводить на печать). +Используя ограничение типажа с блоком `impl`, который использует параметры обобщённого типа, можно реализовать методы условно, для тех типов, которые реализуют указанный типаж. Например, тип `Pair` в листинге 10-16 всегда реализует функцию `new` для возврата нового экземпляра `Pair` (вспомните раздел [“Определение методов”](ch05-03-method-syntax.html#defining-methods) Главы 5 где `Self` является псевдонимом типа для типа блока `impl`, который в данном случае является `Pair`). Но в следующем блоке `impl` тип `Pair` реализует метод `cmp_display` только если его внутренний тип `T` реализует типаж `PartialOrd` (позволяющий сравнивать) *и* типаж `Display` (позволяющий выводить на печать). Файл: src/lib.rs @@ -221,7 +221,3 @@ let s = 3.to_string(); Общие реализации приведены в документации к типажу в разделе "Implementors". Типажи и ограничения типажей позволяют писать код, который использует параметры обобщённого типа для уменьшения дублирования кода, а также указывая компилятору, что мы хотим обобщённый тип, чтобы иметь определённое поведение. Затем компилятор может использовать информацию про ограничения типажа, чтобы проверить, что все конкретные типы, используемые с нашим кодом, обеспечивают правильное поведение. В динамически типизированных языках мы получили бы ошибку во время выполнения, если бы вызвали метод для типа, который не реализует тип определяемый методом. Но Rust перемещает эти ошибки на время компиляции, поэтому мы вынуждены исправить проблемы, прежде чем наш код начнёт работать. Кроме того, мы не должны писать код, который проверяет своё поведение во время выполнения, потому что это уже проверено во время компиляции. Это повышает производительность без необходимости отказываться от гибкости обобщённых типов. - - -["Использование объектов типажей, которые разрешены для значений или разных типов"]: ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types -[“Определение методов”]: ch05-03-method-syntax.html#defining-methods \ No newline at end of file From 8ebbcd60adc01fdcbfa24dffc058a5a61e0481fb Mon Sep 17 00:00:00 2001 From: jashka34 Date: Fri, 26 Jan 2024 07:28:47 +0000 Subject: [PATCH 2/4] Translate ch10-02-traits.md via GitLocalize --- rustbook-ru/src/ch10-02-traits.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rustbook-ru/src/ch10-02-traits.md b/rustbook-ru/src/ch10-02-traits.md index dff345df7..45cd4a936 100644 --- a/rustbook-ru/src/ch10-02-traits.md +++ b/rustbook-ru/src/ch10-02-traits.md @@ -12,13 +12,13 @@ Мы хотим создать крейт библиотеки медиа-агрегатора `aggregator`, которая может отображать сводку данных сохранённых в экземплярах структур `NewsArticle` или `Tweet`. Чтобы этого достичь, нам необходимо иметь возможность для каждой структуры получить короткую сводку на основе имеющихся данных, и для этого мы запросим сводку вызвав метод `summarize`. Листинг 10-12 показывает определение типажа `Summary`, который выражает это поведение. -Filename: src/lib.rs +Файл: src/lib.rs ```rust,noplayground {{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/listing-10-12/src/lib.rs}} ``` -Listing 10-12: A Summary trait that consists of the behavior provided by a summarize method +Листинг 10-12: Определение типажа Summary, который содержит поведение предоставленное методом summarize Здесь мы объявляем типаж с использованием ключевого слова `trait`, а затем его название, которым в нашем случае является `Summary`. Также мы объявляем крейт как `pub` что позволяет крейтам, зависящим от нашего крейта, тоже использовать наш крейт, что мы увидим в последующих примерах. Внутри фигурных скобок объявляются сигнатуры методов, которые описывают поведения типов, реализующих данный типаж, в данном случае поведение определяется только одной сигнатурой метода `fn summarize(&self) -> String`. @@ -30,7 +30,7 @@ Теперь, после того как мы определили желаемое поведение используя типаж `Summary`, можно реализовать его у типов в нашем медиа-агрегаторе. Листинг 10-13 показывает реализацию типажа `Summary` у структуры `NewsArticle`, которая использует для создания сводки в методе `summarize` заголовок, автора и место публикации статьи. Для структуры `Tweet` мы определяем реализацию `summarize` используя имя пользователя и следующий за ним полный текст твита, полагая что содержание твита уже ограничено 280 символами. -Filename: src/lib.rs +Файл: src/lib.rs ```rust,noplayground {{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/listing-10-13/src/lib.rs:here}} @@ -58,7 +58,7 @@ В примере 10-14 показано, как указать строку по умолчанию для метода `summarize` из типажа `Summary` вместо определения только сигнатуры метода, как мы сделали в примере 10-12. -Filename: src/lib.rs +Файл: src/lib.rs ```rust,noplayground {{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/listing-10-14/src/lib.rs:here}} From d6d1a4f857a86564442cd6377781bffb2a8dd09b Mon Sep 17 00:00:00 2001 From: Yuriy Larin Date: Fri, 26 Jan 2024 07:28:47 +0000 Subject: [PATCH 3/4] Translate ch10-02-traits.md via GitLocalize From 61487909c4d4bb611cf848ada50da3dcf48c7759 Mon Sep 17 00:00:00 2001 From: Mikhail Ostashchenko Date: Fri, 26 Jan 2024 07:28:48 +0000 Subject: [PATCH 4/4] Translate ch10-02-traits.md via GitLocalize --- rustbook-ru/src/ch10-02-traits.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/rustbook-ru/src/ch10-02-traits.md b/rustbook-ru/src/ch10-02-traits.md index 45cd4a936..c597add1c 100644 --- a/rustbook-ru/src/ch10-02-traits.md +++ b/rustbook-ru/src/ch10-02-traits.md @@ -190,11 +190,11 @@ fn some_function(t: &T, u: &U) -> i32 { {{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/no-listing-06-impl-trait-returns-one-type/src/lib.rs:here}} ``` -Возврат либо `NewsArticle` либо `Tweet` не допускается из-за ограничений того, как реализован синтаксис `impl Trait` в компиляторе. Мы рассмотрим, как написать функцию с таким поведением в разделе ["Использование объектов типажей, которые разрешены для значений или разных типов"](ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types) Главы 17. +Возврат либо `NewsArticle` либо `Tweet` не допускается из-за ограничений того, как реализован синтаксис `impl Trait` в компиляторе. Мы рассмотрим, как написать функцию с таким поведением в разделе ["Использование объектов типажей, которые разрешены для значений или разных типов"] Главы 17. ### Использование ограничений типажа для условной реализации методов -Используя ограничение типажа с блоком `impl`, который использует параметры обобщённого типа, можно реализовать методы условно, для тех типов, которые реализуют указанный типаж. Например, тип `Pair` в листинге 10-16 всегда реализует функцию `new` для возврата нового экземпляра `Pair` (вспомните раздел [“Определение методов”](ch05-03-method-syntax.html#defining-methods) Главы 5 где `Self` является псевдонимом типа для типа блока `impl`, который в данном случае является `Pair`). Но в следующем блоке `impl` тип `Pair` реализует метод `cmp_display` только если его внутренний тип `T` реализует типаж `PartialOrd` (позволяющий сравнивать) *и* типаж `Display` (позволяющий выводить на печать). +Используя ограничение типажа с блоком `impl`, который использует параметры обобщённого типа, можно реализовать методы условно, для тех типов, которые реализуют указанный типаж. Например, тип `Pair` в листинге 10-15 всегда реализует функцию `new` для возврата нового экземпляра `Pair` (вспомните раздел [“Определение методов”] Главы 5 где `Self` является псевдонимом типа для типа блока `impl`, который в данном случае является `Pair`). Но в следующем блоке `impl` тип `Pair` реализует метод `cmp_display` только если его внутренний тип `T` реализует типаж `PartialOrd` (позволяющий сравнивать) *и* типаж `Display` (позволяющий выводить на печать). Файл: src/lib.rs @@ -221,3 +221,7 @@ let s = 3.to_string(); Общие реализации приведены в документации к типажу в разделе "Implementors". Типажи и ограничения типажей позволяют писать код, который использует параметры обобщённого типа для уменьшения дублирования кода, а также указывая компилятору, что мы хотим обобщённый тип, чтобы иметь определённое поведение. Затем компилятор может использовать информацию про ограничения типажа, чтобы проверить, что все конкретные типы, используемые с нашим кодом, обеспечивают правильное поведение. В динамически типизированных языках мы получили бы ошибку во время выполнения, если бы вызвали метод для типа, который не реализует тип определяемый методом. Но Rust перемещает эти ошибки на время компиляции, поэтому мы вынуждены исправить проблемы, прежде чем наш код начнёт работать. Кроме того, мы не должны писать код, который проверяет своё поведение во время выполнения, потому что это уже проверено во время компиляции. Это повышает производительность без необходимости отказываться от гибкости обобщённых типов. + + +["Использование объектов типажей, которые разрешены для значений или разных типов"]: ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types +[“Определение методов”]: ch05-03-method-syntax.html#defining-methods \ No newline at end of file