簡體   English   中英

在 Rust 中,什么是 `fn() -> ()`?

[英]In Rust, what is `fn() -> ()`?

我掌握了 Fn(大寫-F)特征: FnFnMutFnOnce 我知道它們是特質,並且像特質一樣工作。

但是fn (小寫-f)呢? 它在編輯器中有不同的顏色,這告訴我這不是特征。 它也可以用在其他地方不能使用的地方(反之亦然),盡管在其他情況下它的行為似乎相似。 我在文檔中找不到任何直接解釋它的內容。

prog-fh 的答案基本上是正確的,但缺乏一些細微差別。 Rust 有三種類似函數的類型:

  1. 函數項是您使用fn foo() {...}創建函數時得到的。 它也是類似元組的結構或枚舉變體的構造函數的類型。 函數項的大小為零(它們不包含數據),並且每個非泛型函數都有一個唯一的、無法命名的函數項類型。 在錯誤消息中,編譯器將這些“Voldemort 類型”顯示為類似fn() -> () {foo} (函數名稱在{} )。

  2. 閉包是類似於函數項的值,但閉包可能包含數據:它們從環境中捕獲的任何變量的副本或引用。 如您所知,您可以使用閉包語法( |args| expression )創建閉包。 和函數項一樣,閉包也有唯一的、 [closure@src/main.rs:4:11: 4:23]類型(由編譯器渲染,類似於[closure@src/main.rs:4:11: 4:23] )。

  3. 函數指針就是你要問的:看起來像fn() -> () 函數指針不能包含數據,但它們不是零大小的; 顧名思義,它們是指針。 一個函數指針可以指向一個函數項,也可以指向一個不捕獲任何東西的閉包,但它不能為空。

函數項和閉包會在可能的情況下自動強制為相關的函數指針類型,這就是為什么let f: fn(i32) = |_| (); let f: fn(i32) = |_| (); 有效:因為閉包不捕獲任何內容,因此可以將其強制轉換為函數指針。

所有三個類似函數的類型都實現了相關的FnFnMutFnOnce特性(除了閉包可能不會實現FnFnMut取決於它們捕獲的內容)。 函數項和函數指針還實現了CopyCloneSendSync (閉包僅在其所有內容都實現時才實現這些特征)。

在性能方面,函數指針是泛型和特征對象之間的折衷。 它們必須被取消引用才能被調用,因此調用函數指針可能比直接調用函數項或閉包慢,但仍比調用dyn Fn trait 對象快,后者除了間接調用外還涉及 vtable 查找。 然而,在實際代碼中,有許多變量會混淆幼稚的分析; 如果性能差異對您很重要,您應該測量它而不是猜測哪個更快。

參考

它是一個函數指針類型

它是指只有一個功能,而不是一個封閉的,因為它包含的功能不捕捉環境中的閉合需要的只是地址。

Fn trait(大寫 F)既可以指代閉包,也可以指代函數。

fn 是函數指針的類型。 另請參閱文檔中的此處: https : //doc.rust-lang.org/std/primitive.fn.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM