为什么这个 return 语句会导致错误,而 return 表达式在 Rust 中却没有?

Why does this return statement cause an error but the return expression doesn't in Rust?

提问人:Thetrue kingofwaffles 提问时间:3/14/2023 更新时间:3/14/2023 访问量:74

问:

我很困惑为什么这段代码在下面工作:

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 分析器的错误,这让我感到困惑。我通常使用很多显式返回,因为当我编码时,我更喜欢显式而不是隐式,但是这个错误让我感到困惑,因为我不明白为什么一个会导致错误而另一个不会?

返回 惰性静态

评论

0赞 tkausl 3/14/2023
@cdhowie对,我没有注意到这不是一个函数。
0赞 Thetrue kingofwaffles 3/14/2023
它适用于我为制作 Rust 操作系统而关注的博客,但我没有运行我正在编写的代码并试图满足 Rust 分析器的要求。但是,一个似乎返回错误,而另一个则没有。本教程也不使用 return 语句。但是,如果我做错了,你能告诉我你会做些什么不同的事情,或者你会如何纠正它吗?有问题的博客:os.phil-opp.com/double-fault-exceptions

答:

4赞 cdhowie 3/14/2023 #1

return用于从函数或闭合中提前返回。该块不是一个函数,因此将块的最终表达式替换为语句不会创建语义等效的代码。{}return

我通常使用很多显式返回,因为当我编码时,我更喜欢显式而不是隐式

然后,您的代码将被大多数 Rust linter 拒绝。它们会将函数的最后一个语句标记为冗余。 用于提前退货。returnreturn

评论

0赞 Thetrue kingofwaffles 3/14/2023
谢谢,我只是喜欢明确说返回,但如果这是不好的做法,我会停止。所以我应该只使用 return 来打破 if-else 语句并返回之类的东西。
0赞 cdhowie 3/14/2023
@Thetruekingofwaffles对。在处理故障场景时,您通常会在块中看到它,以便提前返回函数。matchErr(...)
0赞 Thetrue kingofwaffles 3/14/2023
我想我有时仍然会使用它,但我会变得更舒服,谢谢你,先生。