qidao123.com技术社区-IT企服评测·应用市场
标题:
rust学习二十.10、RUST高级范例之新范例模式和范例别名
[打印本页]
作者:
惊雷无声
时间:
2025-4-3 19:06
标题:
rust学习二十.10、RUST高级范例之新范例模式和范例别名
这两个内容都比较容易明白。
一、新范例(newtype)模式
注意,这里说的是一种编程模式,不是说有一个叫newtype的范例。
这种编程模式的含义:为某个范例作个封装,构建一个新的范例,以便绕过某些束缚,从而达成特定目的。
目的如下:
a.用于抽象掉一些范例的实现细节
b.可以隐藏其内部的泛型范例
c.实现曲线救国
一个典型的例子,利用新范例绕过孤儿规则。
二、范例别名
语法
type xxx=现有的范例
看起来有点像特质中的关联范例界说。
附:特质关联范例实现示例
impl Fight for Person {
type Item = Animal;
fn attack(&self, other: &self::Item) {
println!(
"{}岁{}(性别:{}) 攻击了 {}岁{}",
self.age,
self.name,
self.sex,
other.age,
other.name
);
}
fn defend<T: Danger>(&self, danger: &T) {
println!("{},{}岁{}(性别:{}) 奋起并力图战胜它们",danger.happen(), self.age, self.name, self.sex);
}
}
复制代码
要点
a.简化范例书写
b.使得代码更容易阅读
c.也更方便维护,例如如果许多方法都要求用同个范例,那么这样界说之后就不容易搞错,
作用上和java中界说的枚举常量一个道理。
在rust的尺度库中,有不少的范例别名,例如Result等。
界说说明
a.可以为别名界说别名
b.没有明确的别名层级限定,意思就是你界说了别名a,然后基于a界说b,依次类推,可以界说type n=m.. .有多少层级限定不知道,不外界说个2次应该没有问题的。
rust的范例别名是一种类似Microsoft SqlServer自界说范例的东西。
在 SQL Server 中,可以通过
用户界说数据范例(User-Defined Data Types, UDT)
创建自界说范例,本质上是基于体系数据范例的别名,并附加约束或默认值。
例如:
-- 创建类型:限制长度并校验格式
CREATE TYPE dbo.Email
FROM VARCHAR(255)
NOT NULL
WITH CHECK (CHARINDEX('@', value) > 0);
-- 使用类型
CREATE TABLE Users (
UserID INT PRIMARY KEY,
UserEmail dbo.Email
);
-- 测试插入
INSERT INTO Users VALUES (1, 'test@example.com'); -- 成功
INSERT INTO Users VALUES (2, 'invalid-email'); -- 失败,触发 CHECK 约束
复制代码
只要做过数据库设计,就知道这个东西多好用! 好记、容易保证相同的属性使用相同的范例、维护也非常容易。
如果修改了type,就会发现有的时候,这真是一个绝妙的注意。
这种好东西在postgresql和mysql(8以上)都有类似的实现。
以是,毫无疑问,在rust中这是一个绝妙主意,由于我们都知道rust的范例之复杂貌寝是出名的,有的时候让民气烦,又会耗费许多时间打字,而又了别名就会在某些情况下,大大改善这个征象。
三、新范例示例
use student::*;
use teacher::*;
fn main() {
let lml = Studentinfo {
name: String::from("lml"),
age: 18,
gender: String::from("女"),
no: String::from("12101"),
};
print_student(&lml);
lml.learn();
lml.sleep();
let lu = Teacherinfo {
name: String::from("lu"),
age: 46,
gender: String::from("男"),
position: String::from("教研组长"),
};
lu.teach_student(&lml);
print_teacher(&lu);
let _me = Box::new(String::from("中国"));
let my_lu = MyTeacherinfo(lu);
my_lu.print();
}
struct MyTeacherinfo(Teacherinfo);
impl Print for MyTeacherinfo {
fn print(&self) {
println!(
"教师基本信息-姓名:{},年龄:{},性别:{},职位:{}",
self.0.name, self.0.age, self.0.gender, self.0.position
);
}
}
复制代码
本例中,Teacherinfo是外部包范例。
四、范例别名示例
[code]struct Person { name: String, age: u8,}type Teacher = Person;type Student = Person;type GoodPeople = Student;type Thunk = Box
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4