在这里看问题 3 。
举个例子,我已经这样编辑了。
fn main() {
never_return();
// println!("Failed!");
}
fn never_return() -> ! {
// Implement this function, don't modify the fn signatures
panic!("stop")
}
Run Code Online (Sandbox Code Playgroud)
从 fn 返回某些内容时的期望是没有尾随的;。在上面的情况下,panic!(_)返回一个类型never并执行我期望的操作。但是,相同的 fn 签名返回!,无论宏;后面panic是否有 a ,都会编译为相同的结果。我假设情况是这样,因为panic?的内在本质。但找不到我理解的技术解释。
为什么会这样呢?
举Option<bool>个例子,我知道Option<bool>和的大小bool都是 1 字节,但我仍然不能 100% 理解其变体的内存分配是如何发生的。
它的工作原理如下吗?
Some(true)到00000001
Some(false)到00000000
None00000001除了或00000000(例如:)00000010之外的东西(根据下面的评论从“任何东西”更改)
源代码
pub struct Iterating_ex {
start: u32,
end: u32,
}
impl Iterator for Iterating_ex {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.start >= self.end {
None
} else {
let result = Some(self.start);
self.start += 1;
result
}
}
}
fn main() {
let example = Iterating_ex {
start: 0,
end: 5,
};
for i in example {
println!("{i}");
}
}
Run Code Online (Sandbox Code Playgroud)
输出
0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我理解每段代码想要做什么,但是我无法理解以下内容,可能是由于我对通用迭代器特征缺乏了解;
example.next方法被作为循环调用,直到None …无法理解Google 综合 Rust 的模式匹配 - 解构结构中的第二个演讲者注释点。
\n这是示例代码。
\nstruct Foo {\n x: (u32, u32),\n y: u32,\n}\n\n#[rustfmt::skip]\nfn main() {\n let foo = Foo { x: (1, 2), y: 3 };\n match foo {\n Foo { x: (1, b), y } => println!("x.0 = 1, b = {b}, y = {y}"),\n Foo { y: 2, x: i } => println!("y = 2, x = {i:?}"),\n Foo { y, .. } => println!("y = {y}, other fields were ignored"),\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n …