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 {
    // `u32` は `Copy` を実装しているため、`self` を値で受け取る
    fn to_be(self) -> u32;
}
  • self を消費せずに新しい所有値を作成し、型変換を意味するメソッドは、to で始まる名前にします。

  • to で始まるメソッドは別の型を返し、非自明な型変換、あるいはデータ変換であることを強く示唆します。たとえば、str::to_uppercase です。

  • to メソッドは通常 &self を受け取ります。ただし、その型が Copy を実装している場合は、値として self を受け取ることもできます。これによって、その変換メソッド呼び出しで self が消費されないことも保証されます。

  • 単に &self を受け取り、同じ型の所有値を返すメソッドを定義したいだけなら、Clone または ToOwned を実装します。

  • 元の値を消費するメソッドを定義したい場合は、into という命名パターンを使います。

  • また、プリミティブ型のエンディアンを変換する関数や、newtype の値をコピーして公開する関数でも見られます。

さらに考えてみよう

  • クラスへの質問: to_ownedinto_owned の違いは何でしょうか?

    答え: to_owned&str のような参照値に現れる一方で、into_ownedCow (コピーオンライト)のように、参照型を保持する所有値に現れます。

    Cow のような型は、借用されている参照を含んでいても、それ自体は所有されていることがあります。そのため、Cow の所有値は、それが保持していた参照型の所有値を作成するために消費されます。