Rust学习日记番外篇——代码写诗

中秋节即将来临啦~~提前祝大家月饼节快乐。今天看到了掘金的文章,有个代码写诗的活动,那我就小露一手了。

0x01 选定诗句

在掘金有下面几句诗可选。

  • 举头望明月,低头思故乡。
  • 万里无云镜九州,最团圆夜是中秋。
  • 明月几时有?把酒问青天。
  • 但愿人长久,千里共婵娟。
  • 我昨既赋白兔诗,笑他常娥诚自痴。
  • 今夜月明人尽望,不知秋思落谁家。
  • 举杯邀明月,对影成三人。
  • 忆对中秋丹桂丛。花在杯中。月在杯中。
  • 好时节,愿得年年,常见中秋月。
  • 一年逢好夜,万里见明时。
  • 嫦娥应悔偷灵药, 碧海青天夜夜心。
  • 定知玉兔十分圆,已作霜风九月寒。

看了下这些诗句,果然都是好诗。那我随便选一个吧。于是乎就选了**忆对中秋丹桂丛。花在杯中。月在杯中。 **这句诗出自宋代诗人辛弃疾的《一剪梅·中秋元月》。这句诗大致表述的意思是:“回忆昔日中秋,我置身在芳香的丹桂丛。花影映照在酒杯中,皓月也倒映在酒杯中。”感觉还挺美好的呢。

0x02 构思

我们首先看下这句诗有哪些东西。物有花,月,酒杯,丹桂丛,时间呢就是中秋啦。个人理解,这里花就是指的丹桂花,也就是可以理解为丹桂丛是好多花组成的。花在杯中。月在杯中。这两句感觉很好理解,翻译成代码就是把“花”和“月”加到酒杯中。

0x03 开始Coding

创建结构体和特性

首先创建花和月的结构体

/// 花
pub(crate) struct Flower {pub(crate) id: i32,
}/// 月亮
pub(crate) struct Moon {}

考虑到杯中有花也有月,我这里就将杯子定义成了一个trait,让FlowerMoon去实现它。

/// 杯子
pub(crate) trait Cup {fn add_cup(&self);
}

因为中秋有丹桂丛,也有月亮,中秋我也定义成了一个trait,其实这里完全可以定义为一个struct

/// 中秋
pub(crate) trait MidAutumn {/// 获得丹桂花fn get_dan_gui_flowers(&self) -> Vec<Flower>;/// 获得月亮fn get_moon(&self) -> Moon;
}

PS:将上面的代码保存到mid_autumn.rs中。

main.rs

忆对中秋,这里的中秋是指昔日的中秋。那这里就创建结构体InThePastMidAutumn,实现MidAutumn的特性。

/// 昔日的中秋
struct InThePastMidAutumn {name: &'static str,
}impl MidAutumn for InThePastMidAutumn {// 生成丹桂从fn get_dan_gui_flowers(&self) -> Vec<Flower> {let mut vec: Vec<Flower> = Vec::new();for i in 0..5 {let flower = Flower { id: i };vec.push(flower)}return vec;}// 生成月亮fn get_moon(&self) -> Moon {return Moon {};}
}

继续为FlowerMoon实现Cup的特性。

/// 花在杯中
impl Cup for Flower {fn add_cup(&self) {println!("the flower id :{} in the cup!", self.id);}
}/// 月在杯中
impl Cup for Moon {fn add_cup(&self) {println!("the moon in the cup!");}
}

0x04 main函数调用

fn main() {let the_mid_autumn_day_in_the_past = InThePastMidAutumn { name: "Mid Autumn Day In the Past" };println!("{}", the_mid_autumn_day_in_the_past.name);for flower in the_mid_autumn_day_in_the_past.get_dan_gui_flowers().iter() {flower.add_cup();}the_mid_autumn_day_in_the_past.get_moon().add_cup();
}

代码运行结果:

Mid Autumn Day In the Past
the flower id :0 in the cup!
the flower id :1 in the cup!
the flower id :2 in the cup!
the flower id :3 in the cup!
the flower id :4 in the cup!
the moon in the cup!

0x05 代码改进

其实,我在写代码的过程中,发现月亮其实是只有一个。可以考虑将Moon作为单例来实现。单例实现Moon的代码如下:

impl Moon {pub fn GetInstance() -> &'static Moon {static mut MOON_INSTANCE: Option<Arc<Moon>> = None;unsafe {MOON_INSTANCE.get_or_insert_with(|| {Arc::new(Moon {})});MOON_INSTANCE.as_ref().unwrap()}}
}

0x06 写在最后

这次活动还是比较有意思的,我想大家应该有更好的想法,我在这里也仅仅是抛砖引玉了~~。如果大佬们有什么意见,可以在下面给我留言~

Rust学习日记番外篇——代码写诗相关推荐

  1. h5 php js实验总结,H5学习_番外篇_PHP数据库操作

    1. 文件操作 1.1 打开关闭文件 fopen() resource fopen ( string filename, string mode [, bool use_include_path [, ...

  2. TikZ学习笔记番外篇: 使用tikzcd包绘制交换图

    什么是交换图 映射的合成关系, 用图表示出来, 称为交换图. 怎么绘制 有很多方法可以绘制, 都是基于LaTeX\LaTeXLATE​X 的, 这里我使用了TikZ\mathrm{T}i\mathrm ...

  3. php h5读写数据库,H5学习_番外篇_PHP数据库操作

    php //打开文件 $rh = fopen('PHP_3.txt', 'r+'); //读取文件,第一个參数是文件句柄,第二个是读取方式 //计算文件大小(字节) $num = filesize(' ...

  4. cocos2d-x学习笔记番外篇05:如何快速屏蔽触摸

    cocos2d-x有个问题,即使暂停CCScene运行,触摸仍然有效,有些菜单和按钮仍然会被触发. 所以有的时候我们要手动屏蔽触摸,尤其是在弹出计费画面的,或者使用一些本平台自带控件的时候. 做法有几 ...

  5. 【TDA2x学习】番外篇一、TDA2x工程学习手记

    据振宇师兄说,TDA2HGBRQABCQ1是低配版TDA2x,对于EVE并没有4个,只有2个! 可运行在任意核上的Link:Dup link,Null link,Syn link等可以运行在任何核上 ...

  6. 【TDA2x学习】番外篇三、VisionSDK开发指南笔记

    1.介绍 Vision Software Development Kit (SDK)是一种多处理器.多通道的用于TI家族ADAS SoCs的软件开发平台.该软件框架允许用户创建不同的ADAS应用程序数 ...

  7. 安卓开发学习日记第四天番外篇_用Kotlin炒冷饭——越炒越小_莫韵乐的欢乐笔记

    安卓开发学习日记第四天番外篇--用Kotlin炒冷饭--越炒越小 前情提要 安卓开发学习日记第一天_Android Studio3.6安装 安卓开发学习日记第二天_破坏陷阱卡之sync的坑 安卓开发学 ...

  8. OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字

    OpenCV-Python实战(番外篇)--利用 SVM 算法识别手写数字 前言 使用 SVM 进行手写数字识别 参数 C 和 γ 对识别手写数字精确度的影响 完整代码 相关链接 前言 支持向量机 ( ...

  9. OpenCV-Python实战(番外篇)——利用 KNN 算法识别手写数字

    OpenCV-Python实战(番外篇)--利用 KNN 算法识别手写数字 前言 手写数字数据集 MNIST 介绍 基准模型--利用 KNN 算法识别手写数字 改进模型1--参数 K 对识别手写数字精 ...

最新文章

  1. Hibernate源码阅读2——Service Registry
  2. C++ 百炼成钢20
  3. 2012 Multi-University #8
  4. 啊这,C++现在学还来的及吗?
  5. erp 维护费 要交吗_ERP系统维护费
  6. Linux系统:常用Linux系统管理命令总结
  7. 自动改变文字大小和颜色的javascript效果
  8. Java并发编程系列
  9. 使用Linux版Redis
  10. activemq和kafka的区别
  11. mysql怎么连接数据连接池_Mysql数据库连接池
  12. OpenCV 1.0在VC6下安装与配置(附测试程序)
  13. 低速硬件接口之RS485接口自收发隔离多节点分享
  14. 服务器raid卡维修,服务器Raid卡故障|服务器RAID卡坏恢复数据
  15. React学习笔记之三(关于setState的若干问题及其讨论)
  16. S7-1200PLC—实验五 引风机和送风机的顺序控制
  17. 抖音短连接v.douyin.com/xxx 如何生成?
  18. 高德地图的标志放大_高德地图点标注的分布与缩放
  19. 联想天逸100-15ibd加装固态硬盘折腾记
  20. CSAPP - LAB 1 datalab

热门文章

  1. python界面小游戏贪吃蛇_用Python实现童年小游戏贪吃蛇
  2. 本科毕业设计格式规范
  3. 跨考408计算机学科专业基础综合,考研北京航空航天大学计算机学科专业基础综合(408)重难点解析.doc...
  4. 用AutoCAD画尺寸链小结
  5. 联想小新14pro锐龙版网卡rtl8852ae在ubunru18.04装网卡驱动
  6. 微信内置浏览器屏蔽网页链接怎么办,微信跳转外部浏览器的实现教程
  7. win7 打开图片提示内存不足
  8. 【电商专享】聚划算活动海量商品一键报名,省时省力!
  9. 服务数据对象简介(Java 环境中的下一代数据编程)
  10. 【C语言】for循环嵌套-等式推导