Kotlin 函數的預設參數沒有出現在簽名中 runBlocking 預設參數在源代碼中未定義?預設參數的小坑

来源:https://www.cnblogs.com/MadDonkey/archive/2022/04/19/16163499.html
-Advertisement-
Play Games

我們設計了一款分散式菜單應用,不需要個人去關註公眾號或下載小程式,服務員會提供幾個點單的平板,連接店鋪網路,區域網內通信,這樣大家點單、查看訂單詳情等都不受網路限制。 ...


問題起因

runBlocking的context參數有預設值。但是在Android Studio中查看源代碼,發現源代碼中定義如下:

  @Throws(InterruptedException::class)
  public actual fun <T> runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T

這就很奇怪了。因為doc中明明註釋稱context參數具有預設值,而且官方文檔給出的簽名如下:

expect fun <T> runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T

並且Kotlin在Github倉庫上的源代碼也確實與IDE中一致。
而且實際調試時可以發現確實傳入了預設參數。那麼到底是怎麼回事呢?

真相

經過了反編譯、查看文檔與倉庫多次對照後,終於發現問題所在:
問題的關鍵在於expectactual。初學者(比如我)可能會簡單地不怎麼註意函數簽名的這一部分,然而正是這裡造成了預設參數在源代碼中令人困惑的現象!
由於expect定義處已經給出了預設參數,因此當調用到actual函數時,確實可以起到傳入預設參數的作用。然而,令人十分困惑的是,在IDE中查找函數位置只能溯源到actual的函數而不是expect部分,因此很可能產生誤解。
吃一塹長一智,以後再遇到類似地情況,請註意方法簽名是否有actual!預設參數可能定義在expect部分中!另外,優先查看官方文檔,IDE溯源代碼可能產生誤解。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為了寫入Bootloader, 要開啟SSH, 要開啟SSH, 就需要將小米路由器的 ROM 更新為開發版. 在小米的 miwifi 下載頁面找到路由器對應的開發版 ROM(R3G ROM 開發版). ROM 的升級有兩種方式 登陸路由器後臺線上升級 如果前一個方式不行, 可以將其拷貝到U盤根目錄... ...
  • linux伺服器網路配置 環境:ubuntu 18.04 配置IP地址 通過ifconfig命令查看網卡信息 chen@ubuntu:~$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.16. ...
  • 如果一個任務獲取信號量失敗,該任務就必須等待,直到其他任務釋放信號量。本文的重點是,在Linux中,當有任務釋放信號量之後,如何喚醒正在等待該信號量的任務。 信號量定義如下: struct semaphore { raw_spinlock_t lock; unsigned int count; st ...
  • Centos 7 開機進入選擇系統界面 按e選擇進入系統,一般預設第一個(進入系統過程中可以持續按上下鍵,避免跳過此頁面) 修改Grud 進入界面後往下找,找到以linux16開頭的一串命令,在此行末尾添加 init=/bin/bash 在同一行命令中找到ro 改成 rw 讓用戶有寫許可權,修改密碼用 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 環境需求 環境配置 ①配置靜態地址、主機名 vi /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=static IPADDR=192.168.153.70 NETMASK=255.255.2 ...
  • 針對MIPS指令集本身的講解,主要是它上層的彙編表示和下層的機器表示,以及它的訪存方式、操作數等等。同時也對MIPS指令集日落西山表示感慨。 ...
  • 安裝軟體 pacman -S (軟體名):安裝軟體,若有多個軟體包,空格分隔 pacman -S --needed (軟體名):安裝軟體,若存在,不重新安裝最新的軟體 pacman -Sy (軟體名):安裝軟體前,先從遠程倉庫下載軟體包資料庫 pacman -Sv (軟體名):輸出操作信息後安裝 p ...
  • MySQL 的 GRANT和REVOKE 命令 GRANT - 授權 將指定 操作對象 的指定 操作許可權 授予指定的 用戶; 發出該 GRANT語句的可以是資料庫管理員,也可以是該資料庫對象的創建者; 查詢 查看用戶自己許可權 SHOW GRANTS; 查看其他用戶許可權 SHOW GRANTS FOR ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...