細談kotlin中綴表達式

  • Kotlin 是一種適應你編程風格的語言,允許你在想什么時候寫代碼就什么時候寫代碼。Kotlin 提供了一些機制,幫助我們編寫易讀易懂的代碼。
  • 其中一個非常有趣的機制是 中綴表達式(infix notation)。它允許我們定義和調用函數時省略點號(.)和括號。

中綴表達式

中綴表達式在算術和邏輯代碼中使用。它的特點是操作符寫在兩個操作數之間,例如:2 + 3,其中 "+" 是一個中綴操作符。

在中綴表達式中,函數名放在參數之間,函數名本身充當操作符。例如函數 add(2, 4) 表示加法(add),也就是 2 add 4

要定義中綴函數,必須滿足以下條件:

  • 必須是成員函數或擴展函數。

  • 必須有且只有一個參數。

  • 參數不能是可變數量參數(vararg),且不能有默認值。

只需在函數定義前加上 infix 關鍵字即可定義中綴函數。

infix fun Int.add(x: Int): Int = this + xfun main() {println(1.add(2)) // 結果是 3,作為擴展函數調用println(1 add 2)  // 結果是 3,作為中綴函數調用
}

解釋代碼

你可以隨時創建中綴函數,比如為了提高代碼的可讀性,或者創建領域特定語言(DSL)。但要記住,中綴函數調用的優先級低于算術操作符以及語言內置的其他元素,比如類型轉換和 rangeTo 操作符。

infix fun Int.add(x: Int): Int = this + x
fun main() {println(1 add 2 + 3)   // 6,等價于 1 add (2 + 3)println(1 add (2 + 3)) // 6println(0..(1 add 3))  // 0..4
}

另一方面,中綴函數調用的優先級高于布爾操作符 &&||,以及類型檢查 is 和區間檢查 in 等操作符。

infix fun Int.add(x: Int): Int = this + x
fun main() {println(1 and 2 xor 3 add 4) // 等價于 1 and 2 xor (3 add 4) -> 7println(1 add 2 in 3..4)     // 等價于 (1 add 2) in 3..4 -> true
}

記住,中綴函數調用時,接收者和參數都必須明確指定,并且在函數體內必須使用 this 來引用當前接收者。

infix fun Int.add(x: Int): Int = this + x // this 是接收者
fun main() {println(2 + 3) // 這里的接收者是 2
}

標準庫中的中綴函數

Kotlin 標準庫中有許多使用中綴調用的函數示例:

  • to():用于創建 Pair<A, B>Map 的條目。

  • 位運算函數:and(), or(), shl(), shr(), ushr(), xor()

  • 布爾類型的方法:and(), or(), xor()

  • 字符串類的方法:matches()zip() 等。

fun main() {println("Hi" to "Kotlin")                          // 輸出: (Hi, Kotlin)println(0x123456 shr 16)                           // 輸出: 18println(true and false or true xor false)          // 輸出: trueprintln("Hi, Kotlin" matches ".*Kotlin".toRegex()) // 輸出: true
}

結論

中綴函數是讓代碼更具可讀性和可維護性的強大工具。在使用時要注意其定義要求和運算符優先級。中綴表達式能幫助你提升代碼質量,擴展代碼書寫的可能性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88788.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Nagios Core] CGI接口 | 狀態數據管理.dat | 性能優化

鏈接&#xff1a;https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/ docs&#xff1a;Nagios Core Nagios Core 是功能強大的基礎設施監控系統&#xff0c;包含 CGI 程序&#xff0c;允許用戶通過 Web 界面查看當前狀態、歷史記錄等。通過以下技術棧實現…

Linux進程優先級機制深度解析:從Nice值到實時調度

前言 在Linux系統中&#xff0c;進程優先級決定了CPU資源的分配順序&#xff0c;直接影響系統性能和關鍵任務的響應速度。無論是優化服務器負載、確保實時任務穩定運行&#xff0c;還是避免低優先級進程拖慢系統&#xff0c;合理調整進程優先級都是系統管理和性能調優的重要技能…

深入淺出Kafka Broker源碼解析(下篇):副本機制與控制器

一、副本機制深度解析 1.1 ISR機制實現 1.1.1 ISR管理核心邏輯 ISR&#xff08;In-Sync Replicas&#xff09;是Kafka保證數據一致性的核心機制&#xff0c;其實現主要分布在ReplicaManager和Partition類中&#xff1a; public class ReplicaManager {// ISR變更集合&#xff0…

Fluent許可文件安裝和配置

在使用Fluent軟件進行流體動力學模擬之前&#xff0c;正確安裝和配置Fluent許可文件是至關重要的一步。本文將為您提供詳細的Fluent許可文件安裝和配置指南&#xff0c;幫助您輕松完成許可文件的安裝和配置&#xff0c;確保Fluent軟件能夠順利運行。 一、Fluent許可文件安裝步驟…

Python----大模型( RAG的文本分割,文本分割方法 )

一、RAG文本分割RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09;模型是一種結合了檢索 和生成能力的自然語言處理模型。 它通過檢索相關的文檔片段&#xff0c;并將這些信息作為生成過程的上下文&#xff0c;以提高生成質量 和準確性。在R…

vue筆記3 VueRouter VueX詳細講解

vueRouter & vueX 看到這里的朋友如果沒有看過前幾期&#xff0c;可以通過文章的鏈接跳轉到第一期&#xff0c;從第一期的 vue2 語法開始學習&#xff0c;如果是復習的朋友&#xff0c;也可以看本期只學習 vueRouter & VueX 項目初始化 經過上期&#xff0c;我們學習…

從當下需求聊聊Apifox 與 Apipost 的差異

作為一名長期投身于復雜項目開發的工程師&#xff0c;我深切體會到一款適配的接口管理工具對提升開發效率的關鍵意義。當團隊在進行工具選型時&#xff0c;我對 Apifox 和 Apipost 展開了全面且系統的對比分析&#xff0c;其中的諸多發現&#xff0c;值得與大家深入探討。 一、…

藍牙協議棧高危漏洞曝光,攻擊可入侵奔馳、大眾和斯柯達車載娛樂系統

OpenSynergy BlueSDK關鍵漏洞&#xff0c;可遠程執行代碼入侵數百萬車輛系統PCA網絡安全公司的研究人員在OpenSynergy BlueSDK藍牙協議棧中發現了一組被統稱為"完美藍"&#xff08;PerfektBlue&#xff09;的關鍵漏洞。利用這些漏洞可能對數百萬輛汽車實施遠程代碼執…

Android 性能優化:啟動優化全解析

前言 Android應用的啟動性能是用戶體驗的重要組成部分。一個啟動緩慢的應用不僅會讓用戶感到煩躁&#xff0c;還可能導致用戶放棄使用。 本文將深入探討Android應用啟動優化的各個方面&#xff0c;包括啟動流程分析、優化方法、高級技巧和具體實現。 一、Android應用啟動流程深…

前沿重器[69] | 源碼拆解:deepSearcher動態子查詢+循環搜索優化RAG流程

前沿重器欄目主要給大家分享各種大廠、頂會的論文和分享&#xff0c;從中抽取關鍵精華的部分和大家分享&#xff0c;和大家一起把握前沿技術。具體介紹&#xff1a;倉頡專項&#xff1a;飛機大炮我都會&#xff0c;利器心法我還有。&#xff08;算起來&#xff0c;專項啟動已經…

Vue+axios

1. axios簡介axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;主要用于瀏覽器和 Node.js 環境中發送 HTTP 請求。它是目前前端開發中最流行的網絡請求庫之一&#xff0c;被廣泛應用于各種 JavaScript 項目&#xff08;如 React、Vue、Angular 等框架或原生 JS 項目&#x…

通過Tcl腳本命令:set_param labtools.auto_update_hardware 0

1.通過Tcl腳本命令&#xff1a;set_param labtools.auto_update_hardware 0 禁用JTAG上電檢測&#xff0c;因為2016.1 及更高版本 Vivado 硬件管理器中&#xff0c;當 FPGA正連接編程電纜時 重新上電&#xff0c;可能會出現FPGA無法自動加載程序的故障。 2.還可以通過 hw_serv…

Spring Boot 安全登錄系統:前后端分離實現

關鍵詞&#xff1a;Spring Boot、安全登錄、JWT、Shiro / Spring Security、前后端分離、Vue、MySQL 詳細代碼請參考這篇文章&#xff1a;完整 Spring Boot Vue 登錄 ? 摘要 在現代 Web 應用中&#xff0c;用戶登錄與權限控制是系統安全性的基礎環節。本文將手把手帶你實現…

Docker高級管理--Dockerfile 鏡像制作

目錄 一&#xff1a;Docker 鏡像管理 1:Docker 鏡像結構 &#xff08;1&#xff09; 鏡像分層核心概念 &#xff08;2&#xff09;鏡像層特性 &#xff08;3&#xff09;關鍵操作命令 &#xff08;4&#xff09;優化建議 2&#xff1a;Dockerfile介紹 &#xff08;1&…

Leetcode力扣解題記錄--第42題 接雨水(動規和分治法)

題目鏈接&#xff1a;42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 這里我們可以用兩種方法去解決巧妙地解決這個題。首先來看一下題目 題目描述 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。…

寶塔配置pgsql可以遠程訪問

本地navicat premium 17.0 可以遠程訪問pgsql v16.1寶塔的軟件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客戶端認證&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses關鍵字&#xff1b;第三步&#xff1a;在navicat里配…

小架構step系列12:單元測試

1 概述 測試的種類很多&#xff1a;單元測試、集成測試、系統測試等&#xff0c;程序員寫代碼進行測試的可以稱為白盒測試&#xff0c;單元測試和集成測試都可以進行白盒測試&#xff0c;可以理解為單元測試是對某個類的某個方法進行測試&#xff0c;集成測試則是測試一連串的…

SpringBoot3-Flowable7初體驗

目錄簡介準備JDKMySQLflowable-ui創建流程圖要注意的地方編碼依賴和配置控制器實體Flowable任務處理類驗證啟動程序調用接口本文源碼參考簡介 Flowable是一個輕量的Java業務流程引擎&#xff0c;用于實現業務流程的管理和自動化。相較于老牌的Activiti做了一些改進和擴展&…

phpMyAdmin:一款經典的MySQL在線管理工具又回來了

phpMyAdmin 是一個免費開源、基于 Web 的 MySQL/MariaDB 數據庫管理和開發工具。它提供了一個直觀的圖形用戶界面&#xff0c;使得我們無需精通復雜的 SQL 命令也能執行大多數數據庫管理任務。 phpMyAdmin 項目曾經暫停將近兩年&#xff0c;不過 2025 年又開始發布新版本了。 …

存儲服務一NFS文件存儲概述

前言&#xff1a; 網絡文件系統&#xff08;Network File System&#xff0c;NFS&#xff09;誕生于1984年&#xff0c;由Sun Microsystems首創&#xff0c;旨在解決異構系統間的文件共享需求。作為一種基于客戶端-服務器架構的分布式文件協議&#xff0c;NFS允許遠程主機通過T…