Rust实现命令行GCD程序时遇‘无法找到gcd函数’编译错误的解决求助
Rust实现命令行GCD程序时遇‘无法找到gcd函数’编译错误的解决求助
嗨,这个问题我刚入门Rust的时候也踩过坑!其实原因特别直白——你在代码里调用了gcd函数,但从头到尾都没定义过它,编译器当然找不到啦😅
咱们来一步步解决:
方法一:手动实现gcd函数(贴合书本原意)
《Programming Rust》这本书在前面的章节(介绍函数定义的部分)其实已经给出了gcd函数的实现示例,只是你跟着写命令行参数代码时把它漏掉了。你只需要在main函数外面加上这个欧几里得算法的实现就行:
use std::io::Write; use std::str::FromStr; // 这里就是你漏掉的gcd函数实现 fn gcd(a: u64, b: u64) -> u64 { if b == 0 { a } else { gcd(b, a % b) } } fn main() { let mut numbers = Vec::new(); for arg in std::env::args().skip(1) { numbers.push(u64::from_str(&arg).expect("error parsing argument")); } if numbers.len() == 0 { writeln!(std::io::stderr(), "Usage: gcd NUMBER ...").unwrap(); std::process::exit(1); } let mut d = numbers[0]; for m in &numbers[1..] { d = gcd(d, *m); // 现在这个gcd函数就存在啦 } println!("The greatest common divisor of {:?} is {}", numbers, d); }
这个实现用了递归版的欧几里得算法,完全贴合书本的教学思路,适合跟着书一步步打基础。
方法二:用Rust标准库自带的gcd方法(更简洁)
从Rust 1.53版本开始,所有无符号整数类型(比如你用的u64)都内置了gcd方法,直接调用就行,不用自己写函数。你只需要把调用gcd(d, *m)那一行改成下面这样:
d = d.gcd(m);
修改后的完整代码如下:
use std::io::Write; use std::str::FromStr; fn main() { let mut numbers = Vec::new(); for arg in std::env::args().skip(1) { numbers.push(u64::from_str(&arg).expect("error parsing argument")); } if numbers.len() == 0 { writeln!(std::io::stderr(), "Usage: gcd NUMBER ...").unwrap(); std::process::exit(1); } let mut d = numbers[0]; for m in &numbers[1..] { d = d.gcd(m); // 直接用标准库的gcd方法 } println!("The greatest common divisor of {:?} is {}", numbers, d); }
这个方法更简洁,不用自己维护函数实现,适合快速完成程序。
两种方法都能解决你的编译错误,如果你是跟着书的节奏学习,推荐第一种;如果想省事儿,用标准库的方法就好~
内容来源于stack exchange
相关产品推荐
相关产品推荐

