Rust传递&i64参数时出现类型不匹配错误的解决求助
看起来你遇到了一个典型的Rust类型匹配问题,我来帮你理清楚问题出在哪里以及对应的解决办法。
从报错信息来看,编译器提示调用from_req时第二个参数类型不匹配——期望&i64,但实际传入的user_id不符合这个类型。不过看你贴出的代码,create_proj的user_id参数是&i64,from_req的参数要求也是&i64,理论上应该是匹配的,可能是这些隐藏的小问题导致的:
参数被意外修改类型:你有没有在
create_proj函数里、调用from_req之前对user_id做过重新赋值?比如写了let user_id = *user_id;,这会把引用类型&i64转成值类型i64,再传递就会触发类型不匹配错误。如果是这种情况,要么把赋值后的变量改名,要么调用时传&user_id。编译缓存导致的误报:有时候Rust的编译缓存会引发奇怪的错误,你可以试试执行
cargo clean清理缓存,然后重新编译项目,看看问题是否消失。调整参数类型(推荐方案):其实
i64是Copy类型,传递引用并没有必要,反而增加代码复杂度。你可以修改from_req的参数为i64类型,这样不管传入的是i64还是&i64,Rust都会自动处理:修改
from_req的定义:pub(crate) fn from_req(prj_name: &str, user_id: i64) -> Self { let uuid = Uuid::new_v4(); let uuid_string = uuid.to_string().replace("-", ""); Self { doc_name: prj_name.to_string(), created_time: get_current_millisecond(), updated_time: get_current_millisecond(), user_id, // 直接赋值,无需to_owned() doc_status: 1, template_id: 1, project_id: uuid_string } }这里顺便把
prj_name的参数改成&str,它比&String更灵活,能接受更多类型的字符串输入。修改后调用时直接传
user_id即可:let new_proj = TexProjectAdd::from_req(proj_name, user_id);保留引用参数的处理方式:如果一定要保留
from_req的&i64参数要求,那先确认create_proj的user_id确实是&i64类型。如果user_id是i64类型,调用时需要传递它的引用:let new_proj = TexProjectAdd::from_req(proj_name, &user_id);
备注:内容来源于stack exchange,提问作者Dolphin

