在Rust中,我如何将发散函数作为参数传递给另一个函数

时间:2019-04-09 22:21:21

标签: rust

无差异功能正常工作

fn test(f: &Fn() -> u8) {}

但是我不能接受这样的发散功能

fn test_diverging(f: &Fn() -> !) {}

我收到以下错误

error[E0658]: The `!` type is experimental (see issue #35121)
  --> examples/two_tasks.rs:44:31
   |
44 | fn test_diverging(f: &Fn() -> !) {}
   |                               ^

看着issue #35121,我可以看到如何解决这个问题,但是与此同时,有什么解决方法?

4 个答案:

答案 0 :(得分:8)

!在某些情况下仍处于试验阶段,这意味着它在稳定的编译器(截至今天为1.33)上不可用。您可以在夜间编译器上使用它,但必须显式选择加入feature(never_type)

#![feature(never_type)]
fn test_diverging(f: &Fn() -> !) {}

playground

请注意,这意味着该功能可能在稳定之前仍会更改,因此您将承担将来的编译器版本会破坏代码的风险。

另请参见

答案 1 :(得分:6)

在函数中使用Never类型和函数指针类型已经很稳定。因此,如果您不需要使用Fn特性,则可以使用以下特性:

fn test_diverging(f: fn() -> !) {}
//                   ^ note the lowercase f

test_diverging(|| panic!("ouch"));

这样,您就不能传递引用其环境的闭包,但是非捕获闭包和标准函数可以正常工作。

答案 2 :(得分:2)

如果您想保持稳定,可以使用Void(基本上是没有变体的枚举,如果没有不安全的话就无法构造)作为解决方法。

Playground link

答案 3 :(得分:1)

要使用不稳定功能,您需要使用每晚工具链并激活所需的不稳定功能。

#![feature(never_type)]

fn test_diverging(f: &Fn() -> !) {}

另请参阅: