• GengTeng
    2021-09-27
    1. impl From<String> for MyString { fn from(s: String) -> Self { if s.len() > MINI_STRING_MAX_LEN { Self::Standard(s) } else { Self::Inline(MiniString::new(s)) } } } 2. impl MyString { fn push_str(&mut self, string: &str) { match self { MyString::Inline(m) => { let l = m.len(); let len = l + string.len(); if len > MINI_STRING_MAX_LEN { *self = Self::Standard(m.to_string() + string); } else { m.data[l..].copy_from_slice(string.as_bytes()); m.len = len as u8; } } MyString::Standard(s) => s.push_str(string), } } } 3. 32 32 Cow<'a, B> 要求 B 实现 ToOwned,其Owned变体的数据为 对应的 Owned 类型,即 [T] 对应的是 Vec<T>, str 对应的是 String,这两个的大小都是24字节,加上枚举占用的一字节以及8字节对齐,就是32字节。
    展开

    作者回复: 非常棒!第 1 题还可以用泛型参数进一步统一 String/&str,DRY: ```Rust impl<T> From<T> for MyString where T: AsRef<str> + Into<String>, { fn from(s: T) -> Self { match s.as_ref().len() > MINI_STRING_MAX_LEN { true => Self::Standard(s.into()), _ => Self::Inline(MiniString::new(s)), } } } ```

    共 3 条评论
    17
  • Lucas
    2021-10-11
    跟不上了 看不懂了😭

    作者回复: 加油!对暂时理解不了的地方,可以先跳过,之后再回来阅读

    共 3 条评论
    6
  • 记事本
    2021-09-27
    Owned(<B as ToOwned>::Owned) 泛型B转换特征名称是个什么样的语法,老师

    作者回复: as 是 Rust 的关键字,用于做类型转换,比如: let i = 1; // i32 let u = i as usize; // usize 这里 B 有约束是 B: ToOwned,所以 B as ToOwned 是成立的,相当于把 B 转换成 ToOwned,然后因为 ToOwned 带有关联类型,所以强制转换成 ToOwend 后,引用它的关联类型 Owned。

    共 2 条评论
    5
  • 记事本
    2021-10-16
    String在堆上分配内存,String是栈上的一个结构体,假如Box::new(String),是不是String结构体也在堆上了

    作者回复: 对的。

    
    3
  • 核桃
    2021-12-05
    关于所有权和智能指针的理解,可以看看这篇文章 https://zhuanlan.zhihu.com/p/54078587 这些概念在c++里面都是有的,因此从c++的角度去理解一下智能指针与普通指针区别,什么是移动语义,那样返回来看rust的概念,就明白清晰很多了。

    作者回复: 👍

    
    2
  • Ryan
    2021-10-30
    这样实现出来的MyString如果传递给另一个线程,内部栈上的内存可能被释放了。这方面与标准String的区别是如何体现并加以保证的呢?

    作者回复: 在线程间传递栈上的有所有权的数据会 move,所以不会有问题。

    
    2
  • 沈畅
    2022-07-21
    课程学到这,最大的问题感觉不成体系,每篇文章像是博客专题文章。但是章节之间没有体系,作为第一课感觉有些不妥。

    编辑回复: 恩简单说明一下前面的课程设计思路: -前置篇是编程相关的最基本概念 -基础篇是开始接触Rust,语法介绍了1讲,然后插入了get hands dirty 项目从写代码中直观感受Rust语法特性,然后就讲几个Rust的学习重难点了:所有权、生命周期、函数式编程特性、类型系统、泛型编程、错误处理等 作为“第一课”,语法讲的不是很多确实不够友好,一是课程篇幅有限,二是Rust的官方文档做的非常好,另外也有老师个人倾向觉得语法详细讲没有太大必要,毕竟再怎么样讲,也得学习者自己敲代码上手慢慢熟悉风格。 所以可能没有给你非常好的学习体验,表示抱歉。 你可以配合官方的Rust book一起使用,另外加餐中老师和几个同学也分享了自己的学习资料,祝学习愉快~

    共 2 条评论
    1
  • Mr_李冲
    2021-12-26
    文中Cow部分示例段Url::parse有个bug,url左右两边各有个尖括号,需要去掉,否则会解析url失败,unwrap后导致程序崩溃。 更正后是下面这个: let url = Url::parse("https://tyr.com/rust?page=1024&sort=desc&extra=hello%20world").unwrap();

    作者回复: 多谢指正!估计是代码粘到文档中的问题,我让编辑修改了。github 上的代码是正确的。

    
    1
  • yg
    2021-11-30
    陈老师您好,用rust编写内核模块的话,哪里有资料可以参考么

    作者回复: 可以参考:https://github.com/Rust-for-Linux/linux/tree/rust/Documentation/rust

    
    1
  • Ryan
    2021-11-07
    我感觉这课程得至少刷3遍才能看懂,已经跟不上了。。。

    作者回复: 慢慢来,别急

    
    1