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

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 写在最后

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuuhhhyyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值