簡體   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