Code Fix

初級

E0061: this function takes N arguments but M were supplied の原因と直し方

関数が定義している数と異なる数の引数を渡すと、コンパイル時にE0061エラーになります。引数を1つ多く渡した、あるいは渡し忘れたことが典型的な原因です。

エラーメッセージの読み方

error[E0061]: this function takes 2 arguments but 3 arguments were supplied
E0061
エラーコード — `rustc --explain E0061` で詳しい説明が見られます
this function takes 2 arguments but 3 arguments were supplied
詳細メッセージ — 何が問題だったか

このエラーが出る典型パターン

パターン1

 1  fn add(a: i32, b: i32) -> i32 {
 2      a + b
 3  }
 4  
 5  fn main() {
 6      println!("{}", add(1, 2, 3));
                              ^
 7  }
error[E0061]: this function takes 2 arguments but 3 arguments were supplied

addは引数を2個受け取ると定義されています。3個渡すと個数が合わずコンパイルエラーになります。

直し方: 1, 2, 31, 2 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  fn greet(name: &str, times: i32) {
 2      for _ in 0..times {
 3          println!("hi {}", name);
 4      }
 5  }
 6  
 7  fn main() {
 8      greet("taro"      );
                    ^
 9  }
error[E0061]: this function takes 2 arguments but 1 argument was supplied

greetは名前と回数の2つの引数が必要です。1つしか渡さないと個数が足りずエラーになります。

直し方: "taro""taro", 2 にします。

この問題を解いてみる →

パターン3

 1  fn multiply(a: i32, b: i32, c: i32) -> i32 {
 2      a * b * c
 3  }
 4  
 5  fn main() {
 6      println!("{}", multiply(2, 3   ));
                                   ^
 7  }
error[E0061]: this function takes 3 arguments but 2 arguments were supplied

multiplyは3つの引数を要求しています。2つしか渡さないと足りない分だけエラーになります。

直し方: 2, 32, 3, 4 にします。

この問題を解いてみる →

パターン4

 1  fn subtract(a: i32, b: i32) -> i32 {
 2      a - b
 3  }
 4  
 5  fn main() {
 6      println!("{}", subtract(10, 3, 1));
                                    ^
 7  }
error[E0061]: this function takes 2 arguments but 3 arguments were supplied

Rustの関数はデフォルト引数や可変長引数を素朴にはサポートしないため、個数は厳密に一致させます。

直し方: 10, 3, 110, 3 にします。

この問題を解いてみる →

パターン5

 1  fn describe(name: &str, age: i32) {
 2      println!("{} is {}", name, age);
 3  }
 4  
 5  fn main() {
 6      describe("hanako", 20, true);
                          ^
 7  }
error[E0061]: this function takes 2 arguments but 3 arguments were supplied

余分な引数を渡しても無視されることはなく、定義と個数が違えばコンパイルエラーになります。

直し方: "hanako", 20, true"hanako", 20 にします。

この問題を解いてみる →

よくある誤解

「余分な引数は無視され、足りない引数はデフォルト値で補われるはず」という思い込みは誤りです。Rustの関数は引数のデフォルト値をサポートしておらず、個数が完全に一致していないとコンパイルできません。

まとめ

E0061: this function takes N arguments but M were suppliedは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)