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, 3 を 1, 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, 3 を 2, 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, 1 を 10, 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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。