通过锈电子书阅读,我遇到了一个有趣的话题-不同的功能 :
锈有“发散功能”,这是不返回函数的一些特殊的语法:
fn diverges() -> ! { panic!("This function never returns!"); }
发散功能可以用作任何类型的:
let x: i32 = diverges(); let x: String = diverges();
这将是一个不同功能的使用情况? 书中说,
panic!()
导致执行的当前线程与给定的消息崩溃。 由于此功能会导致系统崩溃,就再也不会回来,所以它有型!
这是有道理的,但我想不出还有什么地方发散功能是使用,它似乎非常本地化的,只是panic!
。 我知道一定有一些有用的场景在那里他们为什么推出不同的功能。 会在哪里我可能看到锈不同的功能呢?
它有多种用途。 它可以用于被设计恐慌或退出该程序的功能。 panic!()
本身是一种这样的功能,但它也可以应用于函数其中涡卷panic!()
如打印出更详细的错误信息,然后恐慌。
它也可以用于从不返回功能。 如果一个函数进入一个无限循环,如服务器的主循环,因此永远不会返回,可以把它定义这种方式。
另一种可能的用途是围绕Unix的一个包装exec
函数系列 ,其中,所述当前处理被替换为正在执行的一个。
能有这样的类型,因为它与所有其他类型的兼容是非常有用的。 为了类型安全,锈病,以确保所有分支机构match
或者if
语句返回相同的类型。 但是,如果有一些分支机构是无法访问或指示错误,你需要一些方法来扔掉,将与其他部门返回的类型统一的错误。 由于!
与所有类型的结合,它可以在任何这样的情况下使用。
有一个有趣的RFC (和讨论,在这个主张(部分)的时刻), 扩大了地方!
可以使用 ,认为它应该作为一个完全成熟型等处理()
是; !
是没有与值的类型,与所有其它类型的结合,而()
是一个不同类型相同的值。 我不知道我的全力RFC,但治疗的讨论,同意!
作为一个成熟的类型是有趣的,我认为可以从RFC的其余部分分别提出。
更新 :因为我写上面,在RFC的一部分关于促进!
到完全成熟型被分成一个单独的RFC和合并 ,并且在正在执行的过程中 (目前在夜间的可用版本的特征栅极后面)。 作为一个完整的类型,它可以在多个上下文,例如在使用Result<T, !>
指示的结果,可以永远不会失败,或Result<!, E>
为一体,可以永远不会成功。 这些都是一般的背景下有用的; 如果你有一些特质,需要一个方法返回一个结果,但是对于具体的实现只能成功可能,你并不需要填写一些虚拟的错误类型。
当你从书中引述生锈的底部类型用于指定不返回的功能。 这包括:
-
panic!()
- 永远循环
- 退出程序(除了返回
main()
比如退出() ,它的签名是pub fn exit(code: i32) -> !