繁体   English   中英

在Rust中如何将分歧函数作为参数传递给另一个函数

[英]In Rust how do I pass a diverging function as parameter to another function

非分歧函数工作正常

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() -> !) {}
   |                               ^

问题#35121我可以看到它可能如何解决它,但同时有一个解决方法?

! 在某些情况下仍然是实验性的,这意味着它在稳定的编译器上不可用(截至今天为1.33)。 您可以在夜间编译器上使用它,但您必须明确选择feature(never_type)

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

游乐场

请注意,这意味着该功能可能会在稳定之前发生变化,因此您将接受将来的编译器版本将破坏您的代码的风险。

也可以看看

使用never类型的函数和函数指针类型已经很稳定。 因此,如果您不需要使用Fn特征,您可以使用:

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

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

这样你就无法传递引用其环境的闭包,但非捕获闭包和标准函数工作正常。

如果你想保持稳定,你可以使用Void (基本上是一个没有变种的枚举,不能没有不安全的构造)作为一种解决方法。

游乐场链接

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

#![feature(never_type)]

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

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM