前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust每周一知】 一种 Rust 设计模式

【Rust每周一知】 一种 Rust 设计模式

作者头像
MikeLoveRust
发布2020-02-20 10:54:03
7480
发布2020-02-20 10:54:03
举报
文章被收录于专栏:Rust语言学习交流

最近发现一种 Rust 的设计模式,有点好玩,发出来大家探讨一下。示例如下:

代码语言:javascript
复制
use std::ops::Deref;

trait TraitFoo {
    fn foo(&self);
}

struct A;

impl TraitFoo for A {
    fn foo(&self) {
println!("Huh, I'm foo!");
    }
}

struct B<T> {
    behavior: T
}

impl<T> B<T> {
    pub fn new(behavior: T) -> B<T> {
	B {
	    behavior
	}
    }
}

impl<T> Deref for B<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
	&self.behavior
    }
}


trait TraitBar {
    fn bar(&self);
}

struct C;

impl TraitBar for C {
    fn bar(&self) {
println!("Huh, I'm bar!");
    }
}


fn main() {
    let a = A;
    let b = B::new(a);
    b.foo();

    let c = C;
    let b = B::new(c);
    b.bar();
}

运行结果:

代码语言:javascript
复制
Huh, I'm foo!
Huh, I'm bar!

大体意思就是,B 是一个类型,它接受一个泛型作为它的形参,然后“盗用”了它的实参的方法。

如果 B 实现为一个库,对外导出 B 类型,供别人使用。那么在上层用户来看,就可以很灵活地为这个导出类型的实例添加“额外”的方法。而这些方法,并不是使用通常的为“外部类型”实现“本地 trait”的技术来达到。而是通过将本地实现的类型的实例作为参数传入 B 的构造器来达到。感觉有点意思。

小编才疏学浅,不知道社区中以前有没有过对此种设计模式的讨论,或者其它语言中有没有对应的模式,是不是已命名?大家一起讨论。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档