implement a list using Rust
Rust果然比較複雜,在經歷了n次compile fail,終于寫成了一個 list
難點: 對Rc<>的用法不熟悉。對borrow checker不夠熟悉
有些寫法可能還不是最短的
use std::rc::Rc;
fn main() {
    println!("Hello, world!");
    let li = ListInternal {
        data: 1,
        next: None,
    };
    let li = ListInternal {
        data: 2,
        next: Some(Rc::new(li)),
    };
    let mut l = List { next: Some(li) };
    for i in 1..10{
        l.push_back(i);
    }
    l.print();
}
struct ListInternal {
    data: i32,
    next: Option<Rc<ListInternal>>,
}
struct List {
    next: Option<ListInternal>,
}
impl ListInternal {
    fn print(&self) {
        println!("{}", self.data);
        if let Some(ref v) = self.next {
            v.print();
        }
    }
    fn print_loop(&self) {
        let mut t = self;
        loop {
            println!("{}", t.data);
            if let Some(ref v) = t.next {
                t = v;
            } else {
                break;
            }
        }
    }
    fn last(&mut self) -> &mut Self {
        let mut t = self;
        loop {
            if let Some(ref mut v) = t.next {
                t = Rc::get_mut(v).unwrap();
            } else {
                break;
            }
        }
        t
    }
}
impl List {
    fn new() -> List {
        List { next: None }
    }
    fn print(&self) {
        if let Some(ref v) = self.next {
            v.print_loop();
        }
    }
    fn push_back(&mut self, data: i32) {
        let li = ListInternal {
            data: data,
            next: None,
        };
        if let Some(ref mut v) = self.next {
            v.last().next = Some(Rc::new(li));
        } else {
            self.next = Some(li);
        }
    }
}
implement a list using Rust的更多相关文章
- 转 A Week with Mozilla's Rust
		转自http://relistan.com/a-week-with-mozilla-rust/ A Week with Mozilla's Rust I want another systems la ... 
- Rust 学习 0
		安装Rust 后,本地有文档: file:///usr/local/share/doc/rust/html/index.html file:///usr/local/share/doc/rust/ht ... 
- 2.4 Rust Ownership
		What Is Ownership ownership这个单词有些不好翻译,刚开始就直接叫它“ownership”即可.这里简单说一下,我对它的理解, 从“数据结构与算法”的角度来看,ownershi ... 
- Rust 内存管理
		Rust 内存管理 Rust 与其他编程语言相比,最大的亮点就是引入了一套在编译期间,通过静态分析的方式,确定所有对象的作用域与生命周期,从而可以精确的在某个对象不再被使用时,将其销毁,并且不引入任何 ... 
- 5分钟APIG实战: 使用Rust语言快速构建API能力开放
		序言:Rust语言简介 参与过C/C++大型项目的同学可能都经历过因为Null Pointer.Memory Leak等问题“被” 加班了不知道多少个晚上.别沮丧,你不是一个人,Mozilla Fir ... 
- Rust到底值不值得学--Rust对比、特色和理念
		前言 其实我一直弄不明白一点,那就是计算机技术的发展,是让这个世界变得简单了,还是变得更复杂了. 当然这只是一个玩笑,可别把这个问题当真. 然而对于IT从业者来说,这可不是一个玩笑.几乎每一次的技术发 ... 
- Rust学习笔记1
		这是一份不错的rust教程,目前包括4个block和4个project.全部完成后可以用rust实现一个简单的key-value存储引擎. 注意:Windows下rust貌似会遇到一些bug,强烈建议 ... 
- 通过欧拉计划学Rust编程(第54题)
		由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾. 刷完欧拉计划中的63道基础题,能学会Rust编程吗? "欧拉计划"的网址: https ... 
- 3.5 Rust Generic Types, Traits, and Lifetimes
		Every programming language has tools for effectively handling the duplication of concepts. In Rust, ... 
随机推荐
- JavaScript: 自动类型转换-续
			在上一篇文章中,我们详细讲解了JavaScript中的自动类型转换,由于篇幅限制,没能覆盖到所有的转换规则,这次准备详细讲解一下. 上次我们提到了对象类型参与运算时转换规则: 1). 在逻辑环境中执行 ... 
- Oracle SQL函数-NLSSORT
			Syntax 用途: NLSSORT返回字符值char的排序规则键和显式或隐式指定的排序规则.排序规则键是一个用于根据指定的排序规则对char进行排序的字节字符串.排序规则键的属性是:按二进制比较由给 ... 
- mysql数据库查询缓存总结
			概述 查询缓存(Query Cache,简称QC),存储SELECT语句及其产生的数据结果.闲来无事,做一下这块的总结,也做个备忘! 工作原理 查询缓存工作原理如下: 缓存SELECT操作的结果集和S ... 
- MAC地址IP地址网关地址
			MAC地址与IP地址区别 IP地址和MAC地址相同点是它们都唯一,不同的特点主要有: 对于网络上的某一设备,如一台计算机或一台路由器,其IP地址是基于网络拓扑设计出的,同一台设备或计算机上,改动IP地 ... 
- vs code c/c++编程配置文件
			之前的C语言课程老师只讲了C没有接触C++,但是觉得C++挺重要的,而且python和java再去转exe有点麻烦,所以还是学一下C++. 问过朋友推荐了几个IDE,最后他用的是visual stud ... 
- win10永久激活方法(真正永久激活)
			win10的花费不低,所以很多电脑用户选择搜索激活,但是大部分用的激活工具激活的基本上都是假激活(或许本来就是),kms激活和试用账号临时激活都是有时间限制的,虽然到时都可以继续,但是系统还是明确此激 ... 
- Hibernate中Java对象的生命周期
			一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ... 
- python开发笔记-ndarray方法属性详解
			Python中的数组ndarray是什么? 1.NumPy中基本的数据结构 2.所有元素是同一种类型 3.别名是array 4.利于节省内存和提高CPU计算时间 5.有丰富的函数 ndarray的创建 ... 
- 07. vue-router嵌套路由
			嵌套路由用法 1.嵌套路由功能分析 点击父级路由链接显示模板内容 模板内容中又有子级路由链接 点击子级路由链接显示子级模板内容 2.父路由组件模板 父级路由链接 父组件路由填充位 <p> ... 
- Kafka为什么这么快?
			批量处理 传统消息中间件的消息发送和消费整体上是针对单条的.对于生产者而言,它先发一条消息,然后broker返回ACK表示已接收,这里产生2次rpc:对于消费者而言,它先请求接受消息,然后broker ... 
