Rust学习日记番外篇——代码写诗
中秋节即将来临啦~~提前祝大家月饼节快乐。今天看到了掘金的文章,有个代码写诗的活动,那我就小露一手了。
0x01 选定诗句
在掘金有下面几句诗可选。
- 举头望明月,低头思故乡。
- 万里无云镜九州,最团圆夜是中秋。
- 明月几时有?把酒问青天。
- 但愿人长久,千里共婵娟。
- 我昨既赋白兔诗,笑他常娥诚自痴。
- 今夜月明人尽望,不知秋思落谁家。
- 举杯邀明月,对影成三人。
- 忆对中秋丹桂丛。花在杯中。月在杯中。
- 好时节,愿得年年,常见中秋月。
- 一年逢好夜,万里见明时。
- 嫦娥应悔偷灵药, 碧海青天夜夜心。
- 定知玉兔十分圆,已作霜风九月寒。
看了下这些诗句,果然都是好诗。那我随便选一个吧。于是乎就选了**忆对中秋丹桂丛。花在杯中。月在杯中。 **这句诗出自宋代诗人辛弃疾的《一剪梅·中秋元月》。这句诗大致表述的意思是:“回忆昔日中秋,我置身在芳香的丹桂丛。花影映照在酒杯中,皓月也倒映在酒杯中。”感觉还挺美好的呢。
0x02 构思
我们首先看下这句诗有哪些东西。物有花,月,酒杯,丹桂丛,时间呢就是中秋啦。个人理解,这里花就是指的丹桂花,也就是可以理解为丹桂丛是好多花组成的。花在杯中。月在杯中。这两句感觉很好理解,翻译成代码就是把“花”和“月”加到酒杯中。
0x03 开始Coding
创建结构体和特性
首先创建花和月的结构体
/// 花
pub(crate) struct Flower {
pub(crate) id: i32,
}
/// 月亮
pub(crate) struct Moon {}
考虑到杯中有花也有月,我这里就将杯子定义成了一个trait,让Flower和Moon去实现它。
/// 杯子
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 {};
}
}
继续为Flower和Moon实现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 写在最后
这次活动还是比较有意思的,我想大家应该有更好的想法,我在这里也仅仅是抛砖引玉了~。如果大佬们有什么意见,可以在下面给我留言