如何在Rust中从其他函数获取_s变量?求代码修复方案
解决Rust函数作用域变量访问问题
你的核心问题是shapes函数无法访问main函数作用域内的_s变量——Rust是静态作用域语言,函数只能访问自身参数、内部定义的变量或全局变量,跨作用域直接引用变量会导致编译错误。解决思路很明确:把需要用到的变量通过函数参数传递进去,同时修正代码里的类型不匹配问题。
重构步骤说明
- 传递目标变量:将main中处理后的
_s_int(或原字符串)作为参数传给shapes函数; - 统一数据类型:原代码中
items_array是i32类型,_s_int是usize类型,两者无法直接比较,需要调整为相同类型; - 优化冗余逻辑:原循环计数数组长度的方式可以直接用
数组.len()替代,更简洁高效。
重构后的代码
fn shapes(data: usize, s_int: usize) { let romb = "hello"; let s_array = [romb]; // 统一类型为usize,初始值设为0 let mut items_array = 0; // 先检查索引是否有效,避免数组越界panic if data < s_array.len() { print!("{}", s_array[data]); } else { println!("索引超出数组范围"); return; } // 根据需求调整判断逻辑,示例为比较items_array和传入的s_int if items_array == s_int { println!("匹配成功"); } else { println!("error"); } // 直接用数组len方法获取元素个数,替代循环计数 items_array = s_array.len(); print!("数组元素个数:{}", items_array); } fn main() { let mut _s = String::new(); std::io::stdin() .read_line(&mut _s) .expect("读取输入失败"); let _s_trimmed = _s.trim_end(); let _s_int = _s_trimmed.parse::<usize>().unwrap(); // 同时传入索引值和需要用到的_s_int shapes(_s_int, _s_int); }
关键修改点
- 参数传递:给shapes函数新增
s_int参数,让函数能访问main中处理后的数值; - 类型修正:将
items_array改为usize类型,和_s_int类型统一,解决比较时的类型错误; - 越界防护:新增数组索引有效性判断,避免输入值超过数组长度导致程序崩溃;
- 逻辑简化:用
s_array.len()直接获取数组长度,替代原循环计数的冗余代码。
如果你的需求是用到原字符串_s_trimmed而非转后的数值,只需将shapes的参数改为&str类型,传递_s_trimmed即可,示例如下:
fn shapes(data: usize, s_str: &str) { // 逻辑中直接使用s_str即可 } // main中调用 shapes(_s_int, _s_trimmed);
内容的提问来源于stack exchange,提问作者MN_XD
相关产品推荐
相关产品推荐

