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として宣言されている必要がある。