Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

to: непотребляющее преобразование

Префикс функции, которая принимает заимствованное значение и создаёт значение, владеющее данными.

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

impl str {
    fn to_owned(&self) -> String;

    fn to_uppercase(&self) -> String;
}

impl u32 {
    // Берём `self` по значению, потому что `u32` реализует `Copy`
    fn to_be(self) -> u32;
}
  • Методы, которые создают новое значение, владеющее данными, не потребляя self, и подразумевают преобразование типа, называются с префиксом to.

  • Методы, начинающиеся с «to», возвращают другой тип и сильно подразумевают нетривиальное преобразование типа или даже преобразование данных. Например, str::to_uppercase.

  • Методы «to» чаще всего принимают &self. Однако они могут принимать self по значению, если тип реализует Copy: это также гарантирует, что вызов метода преобразования не потребляет self.

  • Если нужно определить метод, который принимает &self и возвращает значение того же типа, владеющее данными, реализуйте Clone или ToOwned.

  • Если нужно определить метод, который потребляет исходное значение, используйте шаблон именования «into».

  • Также встречается в функциях, которые меняют порядок байтов примитивов, или копируют и показывают значение newtype.

Для дальнейшего изучения

  • Спросите класс: в чём разница между to_owned и into_owned?

    Ответ: to_owned встречается у значений-ссылок, таких как &str, а into_owned — у значений, владеющих данными, которые содержат ссылочные типы, например Cow (copy-on-write).

    Такие типы, как Cow, могут владеть данными, содержащими заимствованные ссылки, поэтому значение Cow, владеющее данными, потребляется для создания значения, владеющего данными, ссылочного типа, которое он хранил.