做网站荣耀体验服官网网站侧导航

张小明 2026/3/2 21:32:51
做网站荣耀体验服官网,网站侧导航,江油专业网站建设咨询,游戏网站设计论文在 Rust 中#xff0c;默认是移动语义#xff0c;而不是传统的值传递或引用传递。这是 Rust 最重要的特性之一#xff0c;理解所有权系统很关键。 基本规则 fn main() {let s1 String::from(hello); // s1 拥有字符串let s2 s1; // 所有…在 Rust 中默认是移动语义而不是传统的值传递或引用传递。这是 Rust 最重要的特性之一理解所有权系统很关键。基本规则fnmain(){lets1String::from(hello);// s1 拥有字符串lets2s1;// 所有权从 s1 移动到 s2// println!({}, s1); // 编译错误s1 不再有效println!({},s2);// 正确s2 现在拥有字符串}函数参数传递默认是移动对于有所有权的类型fntake_ownership(s:String){// s 进入作用域println!({},s);}// s 离开作用域drop 被调用内存被释放fnmain(){letsString::from(hello);take_ownership(s);// s 的所有权移动到函数中// println!({}, s); // 编译错误s 不再有效}使用引用传递借用fnborrow_string(s:String){// s 是对 String 的引用println!({},s);}// s 离开作用域但因为它不拥有所有权所以什么也不会发生fnmain(){letsString::from(hello);borrow_string(s);// 传递引用不转移所有权println!({},s);// 正确s 仍然有效}Copy 类型的值传递对于实现了 Copy trait 的类型会自动复制而不是移动fncopy_value(x:i32){// i32 实现了 Copyprintln!({},x);}fnmain(){letx5;copy_value(x);// x 被复制到函数中println!({},x);// 正确x 仍然有效}不同类型的行为对比fntest_pass_by(muts:String,n:i32,v:Veci32){s.push_str( world);println!(函数内: s{}, n{}, v{:?},s,n,v);}fnmain(){letsString::from(hello);letn42;letvvec![1,2,3];test_pass_by(s,n,v.clone());// s 被移动n 被复制v 被克隆// println!({}, s); // 错误s 被移动了println!({},n);// 正确n 被复制了println!({:?},v);// 正确使用了 clone()}实际示例字母异位词分组中的所有权处理usestd::collections::HashMap;// 版本1移动所有权fngroup_anagrams_take(strs:VecString)-VecVecString{letmutmapHashMap::new();forsinstrs{// strs 的所有权被移动到循环中letmutchars:Vecchars.chars().collect();chars.sort();letkey:Stringchars.into_iter().collect();// 这里 s 被移动到 map 中map.entry(key).or_insert(Vec::new()).push(s);}map.into_values().collect()}// 版本2使用引用借用fngroup_anagrams_borrow(strs:[String])-VecVecString{letmutmapHashMap::new();forsinstrs{// s 是 Stringletmutchars:Vecchars.chars().collect();chars.sort();letkey:Stringchars.into_iter().collect();// 需要克隆字符串因为 map 需要所有权map.entry(key).or_insert(Vec::new()).push(s.clone());}map.into_values().collect()}// 版本3使用字符串切片fngroup_anagrams_slice(strs:[str])-VecVecString{letmutmapHashMap::new();forsinstrs{// s 是 strletmutchars:Vecchars.chars().collect();chars.sort();letkey:Stringchars.into_iter().collect();// 转换为 Stringmap.entry(key).or_insert(Vec::new()).push(s.to_string());}map.into_values().collect()}fnmain(){// 测试版本1letstrs1vec![eat.to_string(),tea.to_string(),tan.to_string(),];letresult1group_anagrams_take(strs1);println!(版本1: {:?},result1);// 测试版本2letstrs2vec![eat.to_string(),tea.to_string(),tan.to_string(),];letresult2group_anagrams_borrow(strs2);println!(版本2: {:?},result2);println!(原数组仍然可用: {:?},strs2);// strs2 仍然有效// 测试版本3letstrs3vec![eat,tea,tan];letresult3group_anagrams_slice(strs3);println!(版本3: {:?},result3);}所有权在 HashMap 中的体现usestd::collections::HashMap;fnmain(){letmutmapHashMap::new();// 插入时移动所有权letkey1String::from(key1);letvalue1String::from(value1);map.insert(key1,value1);// key1 和 value1 不再有效// println!({}, key1); // 错误// println!({}, value1); // 错误// 获取引用ifletSome(v)map.get(key1){println!(值: {},v);// v 是 String}// 获取所有权移除元素ifletSome(v)map.remove(key1){println!(移除的值: {},v);// v 是 String}}性能考虑fnexpensive_to_clone()-String{这是一个很长的字符串....repeat(1000)}fnmain(){letsexpensive_to_clone();// 方法1移动所有权高效fnprocess_owned(data:String){// 处理数据}process_owned(s);// 高效只是移动指针// 方法2克隆低效lets2expensive_to_clone();fnprocess_cloned(data:String)-String{// 如果需要修改并返回可能需要克隆data.clone() modified}letresultprocess_cloned(s2);// 需要克隆整个字符串// 方法3修改可变引用高效letmuts3expensive_to_clone();fnprocess_mutable(data:mutString){data.push_str( modified);}process_mutable(muts3);// 高效不需要克隆}总结表格传递方式 语法 所有权 是否需要 clone 适用场景移动所有权 func(s: String) 转移 不需要 函数需要拥有数据的所有权不可变借用 func(s: String) 不转移 通常不需要 只读访问可变借用 func(s: mut String) 不转移 不需要 需要修改数据克隆 func(s.clone()) 创建新所有权 需要 需要副本同时保留原数据在字母异位词分组中的最佳实践usestd::collections::HashMap;// 最佳实践根据需求选择合适的传递方式pubfngroup_anagrams(strs:VecString)-VecVecString{// strs 的所有权被移动到函数中// 因为我们需要在 HashMap 中存储这些字符串letmutmap:HashMapString,VecStringHashMap::new();forsinstrs{// 移动每个字符串的所有权letkeysort_string(s);// 传递引用给辅助函数map.entry(key).or_insert_with(Vec::new).push(s);}map.into_values().collect()}// 辅助函数只需要读取字符串不需要所有权fnsort_string(s:str)-String{letmutchars:Vecchars.chars().collect();chars.sort_unstable();chars.into_iter().collect()}fnmain(){letstrsvec![eat.to_string(),tea.to_string(),tan.to_string(),ate.to_string(),nat.to_string(),bat.to_string(),];// 调用后strs 的所有权被转移不能再使用letresultgroup_anagrams(strs);println!(结果: {:?},result);}关键点Rust 默认是移动语义不是值传递也不是引用传递实现了 Copy trait 的类型会被复制使用 进行借用引用传递函数签名决定了所有权如何转移在性能敏感的场景合理使用引用避免不必要的克隆
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

东莞网站设计找谁华为云虚拟主机

最近在看一个同学代码的时候,发现代码中大量使用了 Google 开源的 Guava 核心库中的内容,让代码简单清晰了不少,故学习分享出 Guava 中我认为最实用的功能。Guava 项目是 Google 公司开源的 Java 核心库,它主要是包含一些在 Java …

张小明 2026/1/21 4:05:39 网站建设

做网站跳转一键生成app工具

CTFer常见高频工具清单 🧰 CyberChef 介绍 CyberChef是一款强大的编码转换器,地址在:https://gchq.github.io/CyberChef/ 它简单易懂易上手,集成了多种编码转换的功能,如:base64加解密、hex转换、char转…

张小明 2026/1/21 4:05:08 网站建设

黄岩做网站公司电话wordpress 文章长度

FGO-Automata:从手指酸痛到游戏自由的智能蜕变 【免费下载链接】FGO-Automata 一个FGO脚本和API フェイトグランドオーダー自動化 项目地址: https://gitcode.com/gh_mirrors/fg/FGO-Automata 还记得那些深夜刷QP本时手指传来的酸胀感吗?作为一名…

张小明 2026/1/21 4:04:37 网站建设

个人网站怎么做cps牛商网做的包装盒网站

使用Miniconda定制专属AI镜像,提升GPU算力利用率 在现代AI研发的战场上,算力就是生产力。一块A100 GPU每小时的使用成本可能高达数十元,但在许多团队中,这些昂贵资源却常常因“环境问题”而闲置——依赖冲突、CUDA版本不匹配、包…

张小明 2026/1/21 4:04:06 网站建设

家装公司网站开发方案珠宝行业做网站的好处

C语言内存模型深入解析 1. 统一内存模型 在C语言中,尽管所有对象都有类型,但内存模型做了一个简化:所有对象都由字节组成。 sizeof 运算符用于测量对象所占用的字节数。有三种字符类型, char 、 unsigned char 和 signed char ,它们按定义恰好使用一个字节的内存…

张小明 2026/1/21 4:03:35 网站建设

建一个快讯网站要多少钱商业空间设计的特点

Langchain-Chatchat DAO治理机制知识问答系统 在去中心化自治组织(DAO)日益复杂的今天,治理信息的碎片化已成为制约社区发展的关键瓶颈。提案散落在 Discord 频道、投票记录埋没于链上日志、规则变更隐藏在 GitHub 提交中——新成员往往需要数…

张小明 2026/1/21 4:03:04 网站建设