Skip to content

Commit

Permalink
Translate ch08-02-strings.md via GitLocalize
Browse files Browse the repository at this point in the history
  • Loading branch information
dluschan authored and gitlocalize-app[bot] committed Oct 12, 2023
1 parent 99a097f commit b7c0896
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions rustbook-ru/src/ch08-02-strings.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,15 @@
{{#rustdoc_include ../listings/ch08-common-collections/listing-08-15/src/main.rs:here}}
```

<span class="caption">Listing 8-15: Appending a string slice to a <code>String</code> using the <code>push_str</code> method</span>
<span class="caption">Листинг 8-15. Добавление среза строки к <code>String</code> с помощью метода <code>push_str</code></span>

После этих двух строк кода `s` будет содержать `foobar`. Метод `push_str` принимает строковый срез, потому что мы не всегда хотим владеть входным параметром. Например, код в листинге 8-16 показывает вариант, когда будет не желательно поведение, при котором мы не сможем использовать `s2` после его добавления к содержимому значения переменной `s1`.

```rust
{{#rustdoc_include ../listings/ch08-common-collections/listing-08-16/src/main.rs:here}}
```

<span class="caption">Листинг 8-16: Использование фрагмента строки после его добавления в состав другого <code>String</code></span>
<span class="caption">Листинг 8-16: Использование среза строки после добавления её содержимого к другой <code>String</code></span>

Если метод `push_str` стал бы владельцем переменной`s2`, мы не смогли бы напечатать его значение в последней строке. Однако этот код работает так, как мы ожидали!

Expand Down Expand Up @@ -106,7 +106,7 @@ fn add(self, s: &str) -> String {

Причина, по которой мы можем использовать `&s2` в вызове `add` заключается в том, что компилятор может *принудительно привести (coerce)* аргумент типа `&String` к типу `&str`. Когда мы вызываем метод `add` в Rust используется *принудительное приведение* (deref coercion), которое превращает `&s2` в `&s2[..]`. Мы подробно обсудим принудительное приведение в Главе 15. Так как `add` не забирает во владение параметр `s`, `s2` по прежнему будет действительной строкой `String` после применения операции.

Во-вторых, как можно видеть в сигнатуре, `add` забирает во владение `self`, потому что `self` *не имеет* `&`. Это означает, что `s1` в листинге 8-18 будет перемещён в вызов `add` и больше не будет действителен после этого вызова. Не смотря на то, что код `let s3 = s1 + &s2;` выглядит как будто он скопирует обе строки и создаёт новую, это выражение фактически забирает во владение переменную `s1`, присоединяет к ней копию содержимого `s2`, а затем возвращает владение результатом. Другими словами, это выглядит как будто код создаёт множество копий, но это не так; данная реализация более эффективна, чем копирование.
Во-вторых, как можно видеть в сигнатуре, `add` забирает во владение `self`, потому что `self` *не имеет* `&`. Это означает, что `s1` в листинге 8-18 будет перемещён в вызов `add` и больше не будет действителен после этого вызова. Не смотря на то, что код `let s3 = s1 + &s2;` выглядит как будто он скопирует обе строки и создаёт новую, эта инструкция фактически забирает во владение переменную `s1`, присоединяет к ней копию содержимого `s2`, а затем возвращает владение результатом. Другими словами, это выглядит как будто код создаёт множество копий, но это не так; данная реализация более эффективна, чем копирование.

Если нужно объединить несколько строк, поведение оператора `+` становится громоздким:

Expand Down Expand Up @@ -216,7 +216,7 @@ let s = &hello[0..4];

### Методы для перебора строк

Лучший способ работать с фрагментами строк - чётко указать, нужны ли вам символы или байты. Для отдельных скалярных значений в Юникоде используйте метод `chars`. Вызов `chars` у <!-- yaspeller ignore:start -->"Зд"<!-- yaspeller ignore:end --> выделяет и возвращает два значения типа `char`, и вы можете выполнить итерацию по результату для доступа к каждому элементу:
Лучший способ работать с фрагментами строк чётко указать, нужны ли вам символы или байты. Для отдельных скалярных значений в Юникоде используйте метод `chars`. Вызов `chars` у <!-- yaspeller ignore:start -->"Зд"<!-- yaspeller ignore:end --> выделяет и возвращает два значения типа `char`, и вы можете выполнить итерацию по результату для доступа к каждому элементу:

```rust
for c in "Зд".chars() {
Expand Down

0 comments on commit b7c0896

Please sign in to comment.