程序员给女朋友做的网站wordpress附件数据库

张小明 2026/1/3 22:48:35
程序员给女朋友做的网站,wordpress附件数据库,分享设计作品网站,网页设计与制作appRust Deref 自动调用完全指南#xff1a;理解解引用强制多态 概述 在 Rust 中#xff0c;Deref trait 是实现自定义解引用行为的关键。当类型 T 实现了 DerefTarget U 时#xff0c;编译器会在特定场景下自动插入 deref() 调用#xff0c;这个过程称为解引用强制多…Rust Deref 自动调用完全指南理解解引用强制多态概述在 Rust 中Dereftrait 是实现自定义解引用行为的关键。当类型T实现了DerefTarget U时编译器会在特定场景下自动插入deref()调用这个过程称为解引用强制多态Deref Coercion。这个机制让智能指针和新类型模式更加易用。核心规则Deref 自动调用的四种场景1. 函数和方法参数传递最常见usestd::ops::Deref;structMyString(String);implDerefforMyString{typeTargetstr;fnderef(self)-str{self.0}}fnprint_str(s:str){println!({},s);}fnmain(){letmyMyString(String::from(hello));// ✅ 自动发生MyString → strprint_str(my);// 等价于显式写法print_str(my.deref());// 手动调用print_str(*my);// 使用解引用操作符}2. 方法调用.操作符letmyMyString(String::from(hello));// ✅ 自动调用 MyString 的方法// 不这里调用的是 str 的方法println!(长度: {},my.len());// 自动my.deref().len()println!(大写: {},my.to_uppercase());// 如果 MyString 也实现了 len 方法呢implMyString{fnlen(self)-usize{println!(调用 MyString::len);self.0.len()*2}}// 方法调用优先级自身的 Deref 目标的letmyMyString(String::from(hello));println!(长度: {},my.len());// 调用 MyString::len不是 str::len3. 链式 Deref多层解引用structA(String);structB(A);structC(B);implDerefforA{typeTargetString;fnderef(self)-String{self.0}}implDerefforB{typeTargetA;fnderef(self)-A{self.0}}implDerefforC{typeTargetB;fnderef(self)-B{self.0}}fntakes_str(s:str){println!(Got: {},s);}fnmain(){letcC(B(A(String::from(多层))));// ✅ 自动链式解引用// C → B → A → String → strtakes_str(c);}4. 与泛型结合时fnprocessT:DerefTargetstr(s:T){// T 可以是任何 DerefTarget str 的类型println!(处理: {},s.to_uppercase());}fnmain(){process(String::from(hello));// ✅ Stringprocess(Box::new(String::from(world)));// ✅ BoxStringletmyMyString(String::from(custom));process(my);// ✅ MyString}Deref 强制多态的精确规则规则1T→U当T: DerefTarget U// String 实现了 DerefTarget strlets:strString::from(hello);// ✅ 自动转换规则2mut T→mut U当T: DerefMutTarget Uusestd::ops::{Deref,DerefMut};structMyVec(Veci32);implDerefforMyVec{typeTargetVeci32;fnderef(self)-Veci32{self.0}}implDerefMutforMyVec{fnderef_mut(mutself)-mutVeci32{mutself.0}}fnmodify(v:mutVeci32){v.push(42);}letmutmyMyVec(vec![1,2,3]);modify(mutmy);// ✅ mut MyVec → mut Veci32规则3mut T→U允许不可变借用fnread_only(v:Veci32){println!(长度: {},v.len());}letmutmyMyVec(vec![1,2,3]);read_only(my);// ✅ MyVec → Veci32read_only(mutmy);// ✅ mut MyVec → Veci32可变转不可变规则4T→mut U❌禁止永远不能自动从不可变引用获得可变引用。什么情况下 Deref 不会自动调用1. 值类型赋值需要所有权转移letboxedBox::new(String::from(hello));lets:Stringboxed;// ❌ 错误期望 String得到 BoxStringlets:String*boxed;// ✅ 正确需要显式解引用2. 算术运算#[derive(Debug)]structMyInt(i32);implDerefforMyInt{typeTargeti32;fnderef(self)-i32{self.0}}letmyMyInt(5);letresultmy10;// ❌ 错误letresult*my10;// ✅ 正确3. 比较操作letmy1MyInt(5);letmy2MyInt(10);ifmy1my2{}// ❌ 错误需要实现 PartialEqif*my15{}// ✅ 正确但需要显式解引用if**my15{}// ✅ 也可以这样写4. 索引操作structMyVec(Veci32);implDerefforMyVec{typeTargetVeci32;fnderef(self)-Veci32{self.0}}letmyMyVec(vec![1,2,3]);letfirstmy[0];// ❌ 错误需要实现 Index traitletfirstmy.0[0];// ✅ 正确直接访问内部实战案例案例1智能指针模式usestd::ops::{Deref,DerefMut};structSmartBuffer{data:Vecu8,// 其他元数据...version:u32,}implDerefforSmartBuffer{typeTarget[u8];fnderef(self)-[u8]{self.data}}implDerefMutforSmartBuffer{fnderef_mut(mutself)-mut[u8]{mutself.data}}fnmain(){letmutbufferSmartBuffer{data:vec![1,2,3,4,5],version:1,};// 可以使用所有切片方法println!(长度: {},buffer.len());println!(第一个字节: {},buffer[0]);// 现在可以了// 可以传递给接受 [u8] 的函数process_bytes(buffer);// 可以修改buffer[0]100;// 同时还能访问元数据println!(版本: {},buffer.version);}fnprocess_bytes(data:[u8]){// 处理字节...}案例2新类型模式usestd::fmt;#[derive(Debug)]structEmail(String);implDerefforEmail{typeTargetstr;fnderef(self)-str{self.0}}implEmail{fnnew(email:str)-ResultSelf,staticstr{ifemail.contains()email.contains(.){Ok(Email(email.to_string()))}else{Err(无效的邮箱格式)}}}implfmt::DisplayforEmail{fnfmt(self,f:mutfmt::Formatter)-fmt::Result{write!(f,邮箱: {},self.0)}}fnmain(){letemailEmail::new(userexample.com).unwrap();// 可以像字符串一样使用println!(域名: {},email.split().nth(1).unwrap());// 自动解引用为 strsend_email(email);// 还能使用 Display traitprintln!({},email);}fnsend_email(address:str){println!(发送邮件到: {},address);}性能考虑重要事实Deref 强制多态是零成本抽象letsString::from(hello);letlens.len();// 编译后大致相当于// let s String::from(hello);// let len str::len(s.deref()); // 直接内联调用无额外开销最佳实践优先实现Deref而非自定义方法让类型能透明地使用目标类型的方法同时实现Deref和DerefMut如果需要可变访问避免过度使用Deref 不是继承不要滥用注意方法冲突自身方法和目标类型方法同名时自身方法优先文档说明如果实现了 Deref应该在文档中说明常见陷阱// 陷阱1意外的类型转换fnfoo(s:str){/* ... */}letmyMyString(String::from(hello));foo(my);// 这是 MyString不是 String// 但通过 Deref 可以工作// 陷阱2无限递归structBad{data:BoxBad,}implDerefforBad{typeTargetBad;fnderef(self)-Bad{self.data// ❌ 无限递归}}// 应该这样structGood{data:BoxString,}implDerefforGood{typeTargetString;// ✅ 指向不同的类型fnderef(self)-String{self.data}}总结Deref 自动调用是 Rust 中一个强大的特性它✅会自动调用在函数/方法参数传递方法调用.操作符链式解引用泛型约束匹配时❌不会自动调用在值类型赋值需要所有权算术运算比较操作索引操作理解 Deref 强制多态的精确规则能帮助你编写更灵活、更符合 Rust 习惯的代码同时充分利用零成本抽象的优势。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

seo外链群发网站门店设计

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

张小明 2026/1/3 21:58:39 网站建设

怎么搭建自己公司网站网站运营策划提案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个交互式学习应用,通过图文并茂的方式解释算法协商的基本概念。应用应包含分步故障排除向导,模拟练习环境,以及常见问题解答。界面要简洁友…

张小明 2026/1/3 13:48:43 网站建设

专业柳州网站建设哪家好qq游戏做任务领铜板网站

第一章:Open-AutoGLM 屏幕识别不准调试方法在使用 Open-AutoGLM 进行自动化操作时,屏幕元素识别不准确是常见问题,可能由图像分辨率、相似模板匹配阈值或环境干扰引起。为快速定位并解决该问题,需系统性地检查输入参数与运行环境配…

张小明 2026/1/3 19:10:59 网站建设

网站怎么做中英文交互建设银行网上银行网站

VMOS云手机挂机攻略厌烦了重复枯燥的游戏任务?想肝多个小号但心有余力不足?来用VMOS云手机吧,缓解你的疲惫游戏,挂机无压力!新用户注册登录直接送三小时云机体验时长,做活动还可免费领取云机使用时长、优惠…

张小明 2026/1/3 21:03:39 网站建设

成都网站建设scyiyou我对网站开发的项目反思

Unix学习资源与定制使用指南 1. Unix在线文档资源 互联网变化迅速,在线Unix文档更新频繁,但仍是查找Unix系统信息的好地方。不过要注意,Unix有众多不同版本,找到的文档可能不完全适合你,有些信息可能过于专业。 推荐起始网站 :探索OS X Unix在线文档,可从苹果官网开…

张小明 2026/1/2 1:06:52 网站建设

网站开发无形资产apache wordpress配置

百度ERNIE系列再添新成员——ERNIE-4.5-0.3B-PT轻量级模型正式发布,以仅0.36B参数实现高效文本生成,标志着大语言模型向轻量化、普惠化应用迈出重要一步。 【免费下载链接】ERNIE-4.5-0.3B-PT 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/ERN…

张小明 2026/1/2 1:04:50 网站建设