Rust中的元组结构体
- 前言
- 什么是元组结构体
- 可否使用公开字段呢?
- 有用的AsRef<T>
- 总结:
前言
结构体和元组的概念C++,C# 以及其他的语言基本一致,且特征也都接近,简而言之,结构体每一个字段都有名字,且类型根据需要自己设置,而元组没有字段名字,访问时需要使用".0" “.1” ".n"等
什么是元组结构体
介于元组和结构体之间的数据类型,有名字,没有字段名,适合在一些其外部名称即能够表达出类型具体含义,而字段仅仅是值得保存,并且可为其实现impl。
rust 中的struct:
struct Data {
name : String,
age : u16,
...
}
impl Data {
...
}
rust中的元组:
let mut data : (i32,f64) = (10000,184.12);
rust 中的元组结构体:
struct Email(String);
impl Email{
...
}
这样的写法既表达了设计上的意图,又简化了写法。
机灵的小伙伴可能会考虑到,虽然我们这样设计有利于代码维护,但是像这样仅有一个字段的数据,如何合理的访问它呢(比如需要email地址向用户发送邀请时,使用方法一定是会需要取到内部值的)
可否使用公开字段呢?
struct Email(pub String);
不可以,虽然这样可以使得外部代码访问到内部字段,但同时也给了开发者篡改和出错的机会。
有用的AsRef
特征 std::convert::AsRef,提供了这样的能力:调用者可以读取值,但无权改变它。
使用Trait std::convert::AsRef 时,必须实现的函数:
fn as_ref(&self) -> &T //Converts this type into a shared reference of the (usually inferred) input type.
上述email即可做出如下实现:
impl AsRef< str > for Email {
fn as_ref(&self) -> &str {&self.0
}
调用时:
let email = Email(String::from("asdfasdfasdf@162.com"));
... email.as_ref() ...
总结:
如上实现,既可以保护字段的安全性,提高程序封装程度,又可以给到实际使用方访问的机会。
Ps: 一件事如果觉得有用,尽管细碎微小,划过不如记录。
如有勘误,敬请指出。