题目 定义一个SaturatingU16类型。 该类型有一个u16的值。 它支持从u16,u8,&u16,&u8转换。 它支持加法运算符重载。 确保SaturatingU16, u16, &u16和 &SaturatingU16加法达到u16::MAX时饱和。 确保
The Drop trait 在学析构函数的时候,提到了drop函数: 回收类型占用的内存(即std::mem::size_of bytes) 清理值可能正在管理的任何其他资源(比如String的堆缓冲区) 第二点是Drop trait的用武之地 pub trait Drop { fn
复制值(第二部分) 与上一节的例子一样,但是有点不同,使用u32而不是String作为类型。 fn consumer(s: u32) { /* */ } fn example() { let s: u32 = 5; consumer(s); let t = s + 1
复制值(第一部分) 上一章我们学到了所有权和借用。 特别指出了: Rust中每个值在任何给定的时间都有一个调用者。 当函数获取到一个值的所有权时(它消耗了它),函数的调用者就不能再使用这个值了。 这些限制可能有一些局限性。有时候,我们可能需要调用一个获取某个值所有权的函数,但是之后我们可能还需
泛型和关联类型 首先重新复习一下之前学到的两个关于trait的定义,From和Deref pub trait From<T> { fn from(value: T) -> Self; } pub trait Deref { type Target;
From and Into 让我们回到字符串之旅的起点! let ticket = Ticket::new( "A title".into(), "A description".into(), "To-Do".i
Sized trait 事实上,&str 远比表面上看起来更复杂,即使我们已经深入探讨过 Deref 强制转换机制之后也是如此。 根据我们之前对内存布局的讨论,人们可能会合理地预期 &str 在栈上应当只以一个 usize(即指针)的形式存在。然而实际上并非如此。&str 除
Deref trait(解引用trait) 上一节的练习很简单,我就没写 把代码: impl Ticket { pub fn title(&self) -> &String { &self.title } } 修改为: impl Tic
String slices(字符串切片) 在前面几个章节的代码中,我们用到了很多的字符串字面量。他们后面总是调用.to_string()或into()。现在深入研究一下原因。 字符串字面量 我们可以通过将原始文本括在双引号里面来定义字符串文字: let s = "Hello, world!
Trait Bounds(Traits约束) 我们已经看到了两种traits的用例: 解锁“内置”行为(例如:运算符重载) 为已经存在的类型添加新的行为(例如:为u32类型添加is_even方法) 现在是第三种用例:泛型编程 引入问题 到目前为止,我们的所有函数和方法都是和具体类型一起工作的。