提问人:Thetrue kingofwaffles 提问时间:3/14/2023 更新时间:3/14/2023 访问量:74
为什么这个 return 语句会导致错误,而 return 表达式在 Rust 中却没有?
Why does this return statement cause an error but the return expression doesn't in Rust?
问:
我很困惑为什么这段代码在下面工作:
lazy_static! {
static ref TSS: TaskStateSegment = {
let mut tss = TaskStateSegment::new();
tss.interrupt_stack_table[DOUBLE_FAULT_IST_INDEX as usize] = {
const STACK_SIZE: usize = 4096 * 5;
static mut STACK: [u8; STACK_SIZE] = [0; STACK_SIZE];
let stack_start = VirtAddr::from_ptr(unsafe {&STACK});
let stack_end = stack_start + STACK_SIZE;
stack_end
};
tss
};
}
相反,此代码不:
lazy_static! {
static ref TSS: TaskStateSegment = {
let mut tss = TaskStateSegment::new();
tss.interrupt_stack_table[DOUBLE_FAULT_IST_INDEX as usize] = {
const STACK_SIZE: usize = 4096 * 5;
static mut STACK: [u8; STACK_SIZE] = [0; STACK_SIZE];
let stack_start = VirtAddr::from_ptr(unsafe {&STACK});
let stack_end = stack_start + STACK_SIZE;
return stack_end
};
tss
};
}
正是这个特定的返回导致了 Rust 分析器的错误,这让我感到困惑。我通常使用很多显式返回,因为当我编码时,我更喜欢显式而不是隐式,但是这个错误让我感到困惑,因为我不明白为什么一个会导致错误而另一个不会?
答:
4赞
cdhowie
3/14/2023
#1
return
用于从函数或闭合中提前返回。该块不是一个函数,因此将块的最终表达式替换为语句不会创建语义等效的代码。{}
return
我通常使用很多显式返回,因为当我编码时,我更喜欢显式而不是隐式
然后,您的代码将被大多数 Rust linter 拒绝。它们会将函数的最后一个语句标记为冗余。 用于提前退货。return
return
评论
0赞
Thetrue kingofwaffles
3/14/2023
谢谢,我只是喜欢明确说返回,但如果这是不好的做法,我会停止。所以我应该只使用 return 来打破 if-else 语句并返回之类的东西。
0赞
cdhowie
3/14/2023
@Thetruekingofwaffles对。在处理故障场景时,您通常会在块中看到它,以便提前返回函数。match
Err(...)
0赞
Thetrue kingofwaffles
3/14/2023
我想我有时仍然会使用它,但我会变得更舒服,谢谢你,先生。
下一个:Rust 中的有状态嵌入式库
评论