主頁 > 後端開發 > Rust中的函式指標

Rust中的函式指標

2023-05-04 07:25:49 後端開發

什么是函式指標

通過函式指標允許我們使用函式作為另一個函式的引數,函式的型別是 fn (使用小寫的 ”f” )以免與 Fn 閉包 trait 相混淆,fn 被稱為 函式指標(function pointer),指定引數為函式指標的語法類似于閉包,

函式指標型別(使用關鍵字 fn 寫出)指向那些在編譯時不必知道函式識別符號的函式,它們也可以由函式項型別或非捕獲(non-capturing)閉包經過一次自動強轉(coercion)來創建

如何在Rust中定義和使用函式指標

下面是一個簡單的代碼示例,它演示了如何在Rust中定義和使用函式指標:

fn add_one(x: i32) -> i32 {
x + 1 
} 
fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
f(arg) + f(arg) 
} 
fn main() { 
let answer = do_twice(add_one, 5);
println!("The answer is: {}", answer); 
}
復制代碼

這會列印出 The answer is: 12,do_twice 中的 f 被指定為一個接受一個 i32 引數并回傳 i32 的 fn,接著就 可以在 do_twice 函式體中呼叫 f,在 main 中,可以將函式名 add_one 作為第一個引數傳遞給 do_twice,

函式指標與閉包的區別

函式指標和閉包都可以用來表示可呼叫物件,但它們之間有一些重要的區別,其中一個區別是,閉包可以捕獲其周圍環境中的變數,而函式指標則不能,

不同于閉包,fn 是一個型別而不是一個 trait,所以直接指定 fn 作為引數而不是宣告一個帶有 Fn 作為 trait bound 的泛型引數,

函式指標實作了所有三個閉包 trait(Fn、FnMut 和 FnOnce),所以總是可以在呼叫期望閉包的函式時 傳遞函式指標作為引數,

傾向于撰寫使用泛型和閉包 trait 的函式,這樣它就能接受函式或閉包作為引數, 一個只期望接受 fn 而不接受閉包的情況的例子是與不存在閉包的外部代碼互動時:C 語言的函式可以接受函式作為引數,但 C 語言沒有閉包,

函式指標的應用場景

  • 可以作為引數傳遞給其他函式,以便在函式內部呼叫,這在一些高階函式(higher-order functions)中非常常見,例如 map 和 filter 等,

  • 函式指標還可以用于定義回呼函式(callback functions),例如在事件驅動編程(event-driven programming)中,

  • 函式指標還可以存盤在資料結構中,以便稍后呼叫,這在一些演算法中非常有用,例如排序演算法,

函式指標的優缺點

函式指標的優點之一是它們沒有運行時開銷,這意味著它們可以在不影響性能的情況下用于表示可呼叫物件,

但是,函式指標也有一些局限性,例如,它們不能捕獲其周圍環境中的變數,這使得它們不如閉包靈活,此外,函式指標只能指向那些在編譯時已知的函式,這意味著它們不能用于表示匿名函式,from劉金,轉載請注明原文鏈接,感謝!

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551558.html

標籤:其他

上一篇:前綴和

下一篇:返回列表

標籤雲
其他(158367) Python(38110) JavaScript(25398) Java(18011) C(15221) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7156) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1930) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的函式指標

    什么是函式指標 通過函式指標允許我們使用函式作為另一個函式的引數。函式的型別是 fn (使用小寫的 ”f” )以免與 Fn 閉包 trait 相混淆。fn 被稱為 函式指標(function pointer)。指定引數為函式指標的語法類似于閉包。 函式指標型別(使用關鍵字 fn 寫出)指向那些在編譯 ......

    uj5u.com 2023-05-04 07:25:49 more
  • 前綴和

    前綴和 一、介紹 ~~前綴,顧名思義就是一個東西前面的點綴...~~(bushi 其實打比方來說就是:假如有一字串ABCD,那么他的前綴就是A、AB、ABC、ABCD這四個從新從第一個字母一次往后開始拼接的字串。當然這是字串。但前綴和一般應用于陣列,對于給定的陣列a=[1,2,3,4],他的前 ......

    uj5u.com 2023-05-04 06:54:21 more
  • maven

    # maven 1. maven基礎 Maven是apache提供的一個專案管理工具,它的作用就是管理專案 2. maven作用 1). 依賴管理[方便快捷的管理專案依賴的資源(jar包),避免版本沖突問題] 1. 依賴 denpendency 依賴(坐標):一個jar包 groupId 公司域名倒 ......

    uj5u.com 2023-05-03 06:42:45 more
  • 安裝Python

    轉載請注明 來源:http://www.eword.name/ Author:eword Email:[email protected] 安裝Python 一、查詢是否安裝了Python及安裝路徑 #查看當前Python版本 python --version Python 2.7.16 #查看當前所有 ......

    uj5u.com 2023-04-30 07:39:28 more
  • 安裝Python

    轉載請注明 來源:http://www.eword.name/ Author:eword Email:[email protected] 安裝Python 一、查詢是否安裝了Python及安裝路徑 #查看當前Python版本 python --version Python 2.7.16 #查看當前所有 ......

    uj5u.com 2023-04-30 07:39:17 more
  • Django筆記三十四之分頁操作

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記三十四之分頁操作 這一篇筆記介紹一下如何在 Django 使用分頁。 Django 自帶一個分頁的模塊: from django.core.paginator import Paginator 主要用途是串列資料的切割,比如說有 3000 ......

    uj5u.com 2023-04-30 07:33:50 more
  • B/S結構系統的會話機制(session)

    B/S結構系統的會話機制(session) 每博一文案 你跑得快,22歲有個家,身邊全是贊嘆,你跑得慢,30歲還在路上追求夢想。有的人為了車,房拼了一輩子, 有的人買輛摩托車走遍了大好江山。你想成為怎樣的人,過怎樣的生活,只要你不后悔就行。 并不是所有人都能在早上七點鐘起床的,也別拿一碗飯來衡量一個 ......

    uj5u.com 2023-04-30 07:22:05 more
  • Django筆記三十三之快取操作

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記三十三之快取操作 這一節介紹一下如何在 Django 中使用 redis 做快取操作。 在 Django 中可以有很多種方式做快取,比如資料庫,比如服務器檔案,或者記憶體,這里介紹用的比較多的使用 redis 作為快取。 這篇筆記主要內容如 ......

    uj5u.com 2023-04-30 07:21:30 more
  • Markdown基本語法

    Markdown 基本語法介紹 Markdown 是一種輕量級的標記語言,常用于撰寫檔案和博客文章。它簡單易學,具有清晰的結構和格式化效果,是非常適合寫作和發布內容的工具。下面我們來介紹一些 Markdown 基本語法。 1. 標題 在 Markdown 中,可以使用 # 符號表示標題,一級標題使用 ......

    uj5u.com 2023-04-30 07:21:26 more
  • 希望所有計算機學生能看到這篇c語言教程

    大部分程式員走入編程世界第一個學習的語言就是C語言。 作為一門古老的編程語言,c語言擁有48年的發展歷程。 為什么要學習 C語言? C語言是學習計算機程式設計語言的入門語言。最全面的編程面試網站 C語言是一門偏底層的語言,學好它,可以讓你更好的了解計算機。 學會了C語言,你就能學習現在任何的高級編程 ......

    uj5u.com 2023-04-30 07:21:13 more