MeWrite Docs

error[E0599]: no method named 'x' found for struct

Rustで構造体に存在しないメソッドを呼び出した際のコンパイルエラー

概要

Rustで構造体やenum、プリミティブ型に対して、定義されていないメソッドを呼び出そうとした際に発生するコンパイルエラーです。

エラーメッセージ

error[E0599]: no method named `foo` found for struct `MyStruct` in the current scope
  --> src/main.rs:10:5
   |
5  | struct MyStruct;
   | --------------- method `foo` not found for this struct
...
10 |     s.foo();
   |       ^^^ method not found in `MyStruct`

原因

  1. メソッドの未実装: implブロックでメソッドを定義していない
  2. トレイトのインポート忘れ: トレイトのメソッドを使用するにはuseが必要
  3. 可視性の問題: メソッドがpubでない
  4. 型の不一致: 期待した型と異なる
  5. タイプミス: メソッド名のスペルミス

解決策

1. implブロックでメソッドを定義

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct MyStruct {
    value: i32,
}

// Bad: メソッドが定義されていない
// s.get_value() // Error

// Good: implブロックでメソッドを定義
impl MyStruct {
    fn get_value(&self) -> i32 {
        self.value
    }

    fn set_value(&mut self, value: i32) {
        self.value = value;
    }
}

fn main() {
    let s = MyStruct { value: 42 };
    println!("{}", s.get_value());
}

2. トレイトをインポート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// Bad: トレイトがスコープにない
use std::fs::File;

fn main() {
    let file = File::open("test.txt").unwrap();
    file.read_to_string(&mut String::new()); // Error: method not found
}

// Good: トレイトをuse
use std::fs::File;
use std::io::Read; // Readトレイトをインポート

fn main() {
    let mut file = File::open("test.txt").unwrap();
    let mut contents = String::new();
    file.read_to_string(&mut contents).unwrap();
}

3. トレイトを実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
trait Greet {
    fn greet(&self) -> String;
}

struct Person {
    name: String,
}

// トレイトを実装
impl Greet for Person {
    fn greet(&self) -> String {
        format!("Hello, {}!", self.name)
    }
}

fn main() {
    let p = Person { name: "Alice".to_string() };
    println!("{}", p.greet());
}

4. 参照とデリファレンス

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
struct MyStruct;

impl MyStruct {
    fn method(&self) {
        println!("method called");
    }
}

fn main() {
    let s = MyStruct;
    let r = &s;
    let b = Box::new(MyStruct);

    // すべてOK(自動デリファレンス)
    s.method();
    r.method();
    b.method();
}

5. ジェネリクスとトレイト境界

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
use std::fmt::Display;

fn print_value<T: Display>(value: T) {
    // Display トレイトが実装されている型のみ受け入れ
    println!("{}", value);
}

// カスタム型にDisplayを実装
struct Point { x: i32, y: i32 }

impl Display for Point {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "({}, {})", self.x, self.y)
    }
}

6. derive マクロを使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 一般的なトレイトはderiveで自動実装
#[derive(Debug, Clone, PartialEq)]
struct MyStruct {
    value: i32,
}

fn main() {
    let s = MyStruct { value: 42 };
    println!("{:?}", s);          // Debug
    let s2 = s.clone();           // Clone
    println!("{}", s == s2);      // PartialEq
}

7. Option/Resultのメソッド

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
fn main() {
    let opt: Option<i32> = Some(42);

    // Optionのメソッド
    let value = opt.unwrap();
    let value = opt.unwrap_or(0);
    let value = opt.map(|x| x * 2);

    let result: Result<i32, &str> = Ok(42);

    // Resultのメソッド
    let value = result.unwrap();
    let value = result.unwrap_or(0);
    let value = result.map(|x| x * 2);
}

よくある間違い

  • イテレータのメソッドを使うのにuse std::iter::Iteratorを忘れる(通常は自動)
  • &strStringのメソッドの違いを混同する
  • トレイトオブジェクト(dyn Trait)でサイズが必要なメソッドを呼ぶ

関連エラー

参考リンク

Rust の他のエラー

最終更新: 2025-12-13