Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
CSDN 技术社区
skill_tree_rust
提交
971f8fa1
S
skill_tree_rust
项目概览
CSDN 技术社区
/
skill_tree_rust
通知
32
Star
7
Fork
3
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
skill_tree_rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
971f8fa1
编写于
8月 17, 2022
作者:
J
jackymao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add custom_types
上级
f1bfb772
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
209 addition
and
0 deletion
+209
-0
data/1.rust初阶/2.rust基本概念/3.可自定义类型/custom_types.json
data/1.rust初阶/2.rust基本概念/3.可自定义类型/custom_types.json
+8
-0
data/1.rust初阶/2.rust基本概念/3.可自定义类型/custom_types.md
data/1.rust初阶/2.rust基本概念/3.可自定义类型/custom_types.md
+201
-0
未找到文件。
data/1.rust初阶/2.rust基本概念/3.可自定义类型/custom_types.json
0 → 100644
浏览文件 @
971f8fa1
{
"type"
:
"code_options"
,
"author"
:
"jackymao_com"
,
"source"
:
"custom_types.md"
,
"notebook_enable"
:
false
,
"exercise_id"
:
""
}
\ No newline at end of file
data/1.rust初阶/2.rust基本概念/3.可自定义类型/custom_types.md
0 → 100644
浏览文件 @
971f8fa1
# Rust 自定义类型
在我们常规使用 Rust 的自定义类型中,一般就是使用 struct 和 enum 。
(当你学习到 Rust 的 unsafe 的高级操作之后,可以按自己的意愿构造任何数据类型,甚至可以精细到控制每一个 bit.)
Enum 就是枚举,当你需要从有限的几个选项中针对一种情况操作,或针对每一个选项分别操作,就是用它。
而 struct (结构体) 的使用更是极其广泛。总的来说,struct 是将若干个数据组合在一起表示成一个结构化的数据。比如我们想要构造一个数据结构,表示坐标中的一个点,就是有 x 和 y 坐标,可以使用学习过的原生数据类型浮点 f64,将两个浮点数组合起来:
```
rust
struct
Point
{
x
:
f64
,
y
:
f64
,
}
```
构造好一个结构体数据类型后,可以给它加上一些操作这些数据的方法,也就是函数。一般使用 impl 语法:
```
rust
impl
Point
{
fn
new
()
->
Point
{
...
}
}
```
而对于我们后面会学习到的闭包,rust 编译器实际上会将它改写成一个 struct 。 比如一条直线的方程,y = 2x + 3, 写成闭包形式就是 |x| 2x + 3 ,具体代码形式如下:
```
rust
let
a
=
2.0
;
let
b
=
3.0
;
let
y
=
|
x
|
a
*
x
+
b
;
```
Rust 编译器会将它改写成(这里只是演示,为了简洁有所省略):
```
rust
struct
SomeUnknowType
{
a
:
f64
,
b
:
f64
,
}
impl
SomeUnknowType
{
fn
call
(
&
self
,
x
:
f64
)
->
f64
{
self
.a
*
x
+
self
.b
}
}
let
y
=
SomeUnknowType
{
a
:
2.0
,
b
:
3.0
};
y
.call
(
x
)
```
下面构造一个长方形并求面积的程序,错误的是:
## 答案
```
rust
struct
Point
{
x
:
f64
,
y
:
f64
}
struct
Rectangle
{
Point
,
Point
,
}
fn
main
()
{
let
rec
=
Rectangle
{
{
x
:
1.0
,
y
:
1.0
},
{
x
:
3.0
,
y
:
4.0
},
};
let
width
=
rec
.2
.x
-
rec
.1
.x
;
let
height
=
rec
.2
.y
-
rec
.1
.y
;
let
s
=
width
*
height
;
println!
(
"长方形的宽: {}, 高: {}, 面积: {}"
,
width
,
height
,
s
);
}
```
## 选项
### 定义结构体, 数据在主函数中操作
```
rust
struct
Point
{
x
:
f64
,
y
:
f64
}
struct
Rectangle
{
top_left_point
:
Point
,
bottom_right_point
:
Point
,
}
fn
main
()
{
let
rec
=
Rectangle
{
top_left_point
:
Point
{
x
:
1.0
,
y
:
1.0
},
bottom_right_point
:
Point
{
x
:
3.0
,
y
:
4.0
},
};
let
width
=
rec
.bottom_right_point.x
-
rec
.top_left_point.x
;
let
height
=
rec
.bottom_right_point.y
-
rec
.top_left_point.y
;
let
s
=
width
*
height
;
println!
(
"长方形的宽: {}, 高: {}, 面积: {}"
,
width
,
height
,
s
);
}
```
### 定义结构体, 以及相应的 impl 函数
```
rust
struct
Point
{
x
:
f64
,
y
:
f64
,
}
struct
Rectangle
{
top_left_point
:
Point
,
bottom_right_point
:
Point
,
}
impl
Rectangle
{
fn
width
(
&
self
)
->
f64
{
self
.bottom_right_point.x
-
self
.top_left_point.x
}
fn
height
(
&
self
)
->
f64
{
self
.bottom_right_point.y
-
self
.top_left_point.y
}
fn
area
(
&
self
)
->
f64
{
(
self
.bottom_right_point.x
-
self
.top_left_point.x
)
*
(
self
.bottom_right_point.y
-
self
.top_left_point.y
)
}
}
fn
main
()
{
let
rec
=
Rectangle
{
top_left_point
:
Point
{
x
:
1.0
,
y
:
1.0
},
bottom_right_point
:
Point
{
x
:
3.0
,
y
:
4.0
},
};
let
width
=
rec
.width
();
let
height
=
rec
.height
();
let
s
=
rec
.area
();
println!
(
"长方形的宽: {}, 高: {}, 面积: {}"
,
width
,
height
,
s
);
}
```
###
```
rust
struct
Point
{
x
:
f64
,
y
:
f64
,
}
struct
Rectangle
(
Point
,
Point
);
impl
Rectangle
{
fn
width
(
&
self
)
->
f64
{
self
.1
.x
-
self
.0
.x
}
fn
height
(
&
self
)
->
f64
{
self
.1
.y
-
self
.0
.y
}
fn
area
(
&
self
)
->
f64
{
self
.width
()
*
self
.height
()
}
}
fn
main
()
{
let
rec
=
Rectangle
(
Point
{
x
:
0.0
,
y
:
0.0
},
Point
{
x
:
3.0
,
y
:
4.0
});
let
width
=
rec
.width
();
let
height
=
rec
.height
();
let
s
=
rec
.area
();
println!
(
"长方形的宽: {}, 高: {}, 面积: {}"
,
width
,
height
,
s
);
}
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录