RUST网络客户端的基本技术说明-关联类型

一、泛型(Generic Types)和关联类型(generic associated types)

泛型编程对任何一种语言来说,都是一种追求的目标,如果不支持泛型,那一定会被骂,比如Golang,比如早期的Java。Java是改过自新了,而Go还在独善其身。这里不要谈泛型的优缺点,毕竟仁者见仁,智者见智。但在Rust中支持泛型,这肯定是的了。学过c++的人知道,在c++的模板编程(泛型编程)中,在特化过程中,是有偏特化、全实例化(不是全特化)的技术实现的。不明白就回去翻一下,如果你理解了全实例化,就基本明白了Rust类型中的关联类型,其实就是和全实例化差不多。
关联类型其实就是对一个点位的特定类型符实现一次,而全实例化也差不多。换句话说,如果设计代码的目的是多次反复的复用,就需要用泛型编程,如果只是用一次,那推荐使用关联类型(当然,使用泛型也不是不行,杀鸡用牛刀了)。在Rust中,使用关联类型的最典型的用法是迭代器(Iterator)。
关联类型仍然使用“特性”(Trait)来实现。需要说明的是,这个关联类型的技术仍然是快速演进中,如果有兴趣可以去官网查看资料。

二、关联类型的应用

关联类型的一个简单定义如下:

trait ExampleAssociated {
    type T;
    fn FromData(&self) -> Self::T;
}

大繁至简,其实从语法上看,这东西更类似于c++中的using的用法。但一定不要被迷惑啊。
其实看明白了语法,也就明白了初步的用法,当然,技术小白可能还是需要继续看,那么看一下《RustPrimer》中的一个用例:

// use generic parameters
trait Graph<N, E> {
    fn has_edge(&self, &N, &N) -> bool;
    fn edges(&self, &N) -> Vec<E>;
}
fn distance<N, E, G: Graph<N, E>>(graph: &G, start: &N, end: &N) -> u32 {
}
// use associated types
trait Graph {
    type N;
    type E;
    fn has_edge(&self, &Self::N, &Self::N) -> bool;
    fn edges(&self, &Self::N) -> Vec<Self::E>;
}
fn distance<G: Graph>(graph: &G, start: &G::N, end: &G::N) -> uint {
}
struct Node;
struct Edge;
struct SimpleGraph;
impl Graph for SimpleGraph {
    type N = Node;
    type E = Edge;
    fn has_edge(&self, n1: &Node, n2: &Node) -> bool {
    }
    fn edges(&self, n: &Node) -> Vec<Edge> {
    }
}
let graph = SimpleGraph;
let object = Box::new(graph) as Box<Graph<N=Node, E=Edge>>;

关联类型的优势在一些特定的环境下会发挥得相当棒,比如设计的目标非常明显,只是允许一次实例化的情况下,就不用担心多次使用造成的错误逻辑和数据类型的判断;同样,单一的实现也会使得代码的理解便清晰明白,极大的提高代码的可读性。这也是一个关联类型的溢出效应吧。

三、总结

其实如何使用关联类型,看过上面的表述,应该就很清楚了。说白了,它就是把一些泛型编程的技术做了进一步的细化和模块化。正如设计接口一样,功能尽量简单而不是一个泛型啥都完成。这也是Rust被一些人称道的原因,更细节的把控就意味着安全性的进一步的提高,这才是Rust真正的终极追求,至于成功与否,还得看自己的能力和市场的接受度。
努力吧,归来的少年!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值