为什么要使用不同的功能呢?为什么要使用不同的功能呢?(Why would I use diverge

2019-05-12 07:12发布

通过锈电子书阅读,我遇到了一个有趣的话题-不同的功能 :

锈有“发散功能”,这是不返回函数的一些特殊的语法:

 fn diverges() -> ! { panic!("This function never returns!"); } 

发散功能可以用作任何类型的:

 let x: i32 = diverges(); let x: String = diverges(); 

这将是一个不同功能的使用情况? 书中说,

panic!()导致执行的当前线程与给定的消息崩溃。 由于此功能会导致系统崩溃,就再也不会回来,所以它有型!

这是有道理的,但我想不出还有什么地方发散功能是使用,它似乎非常本地化的,只是panic! 。 我知道一定有一些有用的场景在那里他们为什么推出不同的功能。 会在哪里我可能看到锈不同的功能呢?

Answer 1:

它有多种用途。 它可以用于被设计恐慌或退出该程序的功能。 panic!()本身是一种这样的功能,但它也可以应用于函数其中涡卷panic!()如打印出更详细的错误信息,然后恐慌。

它也可以用于从不返回功能。 如果一个函数进入一个无限循环,如服务器的主循环,因此永远不会返回,可以把它定义这种方式。

另一种可能的用途是围绕Unix的一个包装exec函数系列 ,其中,所述当前处理被替换为正在执行的一个。

能有这样的类型,因为它与所有其他类型的兼容是非常有用的。 为了类型安全,锈病,以确保所有分支机构match或者if语句返回相同的类型。 但是,如果有一些分支机构是无法访问或指示错误,你需要一些方法来扔掉,将与其他部门返回的类型统一的错误。 由于! 与所有类型的结合,它可以在任何这样的情况下使用。

有一个有趣的RFC (和讨论,在这个主张(部分)的时刻), 扩大了地方! 可以使用 ,认为它应该作为一个完全成熟型等处理()是; ! 是没有与值的类型,与所有其它类型的结合,而()是一个不同类型相同的值。 我不知道我的全力RFC,但治疗的讨论,同意! 作为一个成熟的类型是有趣的,我认为可以从RFC的其余部分分别提出。

更新 :因为我写上面,在RFC的一部分关于促进! 到完全成熟型被分成一个单独的RFC和合并 ,并且在正在执行的过程中 (目前在夜间的可用版本的特征栅极后面)。 作为一个完整的类型,它可以在多个上下文,例如在使用Result<T, !>指示的结果,可以永远不会失败,或Result<!, E>为一体,可以永远不会成功。 这些都是一般的背景下有用的; 如果你有一些特质,需要一个方法返回一个结果,但是对于具体的实现只能成功可能,你并不需要填写一些虚拟的错误类型。



Answer 2:

当你从书中引述生锈的底部类型用于指定不返回的功能。 这包括:

  • panic!()
  • 永远循环
  • 退出程序(除了返回main()比如退出() ,它的签名是pub fn exit(code: i32) -> !


文章来源: Why would I use divergent functions?
标签: rust