Rust 関連関数はPythonでいうstaticmethod メモ

関連関数(associated functions)

Rustの関連関数は、型に紐づいていてインスタンスを必要としない関数のこと。これはPythonでいうstaticmethodやclass methodかな?

関連関数とは?

  • インスタンスを作らずに呼び出せる関数

  • 型名に::を付けて呼び出す。

  • 例えば、String::fromはString型の関連関数。

例: 関連関数を定義する

struct MyStruct {
    value: i32,
}

impl MyStruct {
    // 関連関数 (staticで呼び出せる)
    fn static_function() {
        println!("This is a static-like function!");
    }

    // メソッド (インスタンスが必要)
    fn instance_method(&self) {
        println!("Instance method called with value: {}", self.value);
    }

    // 可変なインスタンスが必要なメソッド
    fn mutable_instance_method(&mut self) {
        self.value += 1;
        println!("Mutable method called, new value: {}", self.value);
    }

    // コンストラクタの例
    fn new(value: i32) -> MyStruct {
        MyStruct { value }
    }
}

fn main() {
    // 静的に呼び出せる関数
    MyStruct::static_function();

    // インスタンスを生成
    let mut instance = MyStruct::new(10);

    // インスタンスを通じて呼び出すメソッド
    instance.instance_method();

    // 可変なメソッドの呼び出し
    instance.mutable_instance_method();
}

cargo run        
   Compiling BasicStatement v0.1.0 (/Users/shirotabi/Project/project/Rust/BasicStatement)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.66s
     Running `target/debug/BasicStatement`
This is a static-like function!
Instance method called with value: 10
Mutable method called, new value: 11

以下はエラーになる

struct MyStruct {
    value: i32,
}

impl MyStruct {
    // 関連関数 (staticで呼び出せる)
    fn static_function() {
        println!("This is a static-like function!");
    }

    // メソッド (インスタンスが必要)
    fn instance_method(&self) {
        println!("Instance method called with value: {}", self.value);
    }

    // 可変なインスタンスが必要なメソッド
    fn mutable_instance_method(&mut self) {
        self.value += 1;
        println!("Mutable method called, new value: {}", self.value);
    }

    // コンストラクタの例
    fn new(value: i32) -> MyStruct {
        MyStruct { value }
    }
}

fn main() {
    // インスタンスメソッドだからエラー
    MyStruct::instance_method();
}
cargo run
   Compiling BasicStatement v0.1.0 (/Users/shirotabi/Project/project/Rust/BasicStatement)
error[E0061]: this function takes 1 argument but 0 arguments were supplied
  --> src/main.rs:30:5
   |
30 |     MyStruct::instance_method();
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^-- argument #1 of type `&MyStruct` is missing
   |
note: method defined here
  --> src/main.rs:12:8
   |
12 |     fn instance_method(&self) {
   |        ^^^^^^^^^^^^^^^ -----
help: provide the argument
   |
30 |     MyStruct::instance_method(/* &MyStruct */);
   |                              ~~~~~~~~~~~~~~~~~

For more information about this error, try `rustc --explain E0061`.
error: could not compile `BasicStatement` (bin "BasicStatement") due to 1 previous error

インスタンス変数を書き換えるようなメソッドを定義する場合は&mut selfを使う

Rustでは、インスタンス変数(フィールド)を書き換えるようなメソッドを定義する場合、メソッドの第一引数に&mut selfを指定する必要がある。これにより、「このメソッドはインスタンスの状態を変更する可能性がある」ことを明示する。

また、そのメソッドを呼び出す際には、インスタンス自体がmutとして宣言されている必要がある。

いいなと思ったら応援しよう!