1. 程式人生 > >Kotlin入門(10)七十二變的輸入引數

Kotlin入門(10)七十二變的輸入引數

上一篇文章介紹了Kotlin對函式的基本用法,包括函式的定義、輸入引數的宣告、輸出引數的宣告等等,這些足夠對付簡單的場合了。當然了,倘若一門新語言僅僅滿足於這些雕蟲小技,那也實在沒什麼前途。既然Kotlin志在取代Java,就必須練成Java所不具備的功夫。本篇文章便從函式的輸入引數著手,談談Kotlin對輸入引數的改進與增強之處。

首先複習一下如何宣告函式的輸入引數,比如回答“中國的偉大發明有哪些?”這個問題,需要定義一個函式,根據輸入的幾個發明名稱,然後將這幾個發明拼接成完整的答案。具體的函式定義舉例如下:
    fun getFourBig(general:String, first:String, second:String, third:String, fourth:String):String {
        var answer:String = "$general:$first,$second,$third,$fourth"
        return answer
    }
該函式的目的是獲取中國四大發明的回答,你可以輸入中國古代的四大發明,也可以輸入外國留學生票選的中國現代四大發明。兩種輸入對應的函式呼叫都很簡單,只消按照引數順序依次輸入四大發明的名稱即可,呼叫程式碼如下所示:
    var isOdd = true //如果從初始賦值中能夠知道變數型別,就無需顯式指定該變數的型別
    btn_input_manual.setOnClickListener {
        tv_four_answer.text = if (isOdd) getFourBig("古代的四大發明","造紙術","印刷術","火藥","指南針") else getFourBig("現代的四大發明","高鐵","網購","移動支付","共享單車")
        isOdd = !isOdd
    }

可是這麼做不夠智慧,因為中國古代的四大發明人盡皆知,小學生都知道,何必還得每次都手工輸入呢?於是Kotlin引入了預設引數的概念,允許在定義函式時直接指定輸入引數的預設值,如果呼叫函式時沒有給出某引數的具體值,系統就自動對該引數賦予預設值,從而免去了每次都要手工賦值的麻煩。預設引數的寫法也很簡單,只需在宣告輸入引數時在其後面加上等號與預設值,程式碼如下所示:
    fun getFourBigDefault(general:String, first:String="造紙術", second:String="印刷術", third:String="火藥", fourth:String="指南針"):String {
        var answer:String = "$general:$first,$second,$third,$fourth"
        return answer
    }
有了預設引數,這下函式呼叫簡單多了,就算開發者一時腦袋漿糊想不起來四大發明,也能毫無壓力輕敲程式碼。不信請看下面的呼叫程式碼:
    btn_input_default.setOnClickListener { tv_four_answer.text=getFourBigDefault("古代的四大發明") }
如果不滿意引數的預設值,可在呼叫函式時輸入新的值,例如四大發明的預設值不包含它們的發明者,現在想增加顯示造紙術的發明者蔡倫,則呼叫getFourBigDefault函式於第二個引數填寫符合要求的描述文字,程式碼示例如下:
    btn_input_part.setOnClickListener { tv_four_answer.text=getFourBigDefault("古代的四大發明","蔡倫發明的造紙術") }
有時想要改寫的引數並不位於預設引數的第一個,比如第二個引數的“印刷術”,雖然印刷術起源於中國是毫無疑義的,但是韓國聲稱是他們的古人發明了金屬活字印刷,德國也有確鑿證據證明是古騰堡發明了活字印刷機,這些言論容易誤導外人以為中國只是發明了雕版印刷術而已,事實上不光雕版印刷的發明屬於中國,就連活字印刷都是北宋的畢昇發明的,所以為了正本清源,“印刷術”的名稱可改為影響力更大的“活字印刷”。然而“印刷術”在函式聲明裡面排在“造紙術”後面,莫非要給“印刷術”改名,還得把前面的“造紙術”照抄一遍?為了解決這個不合理的地方,Kotlin又引進了命名引數的概念,說的是呼叫函式時可以指定某個引數的名稱與數值,形如“引數名=引數值”這樣。就前述的“印刷術”改名而言,具體到編碼上面,可參見以下的例子:
    btn_input_name.setOnClickListener { tv_four_answer.text=getFourBigDefault("古代的四大發明",second="活字印刷") }

預設引數結合命名引數的寫法,至此告一段落。不料吃瓜群眾有話說,咱們中國歷史悠久、地大物博,偉大發明何止四大發明呢?譬如絲綢、瓷器、茶葉,每個拎出來都是響噹噹的物件,其地位在古代西方人眼裡,好比現代中國人愛買的LV、勞力士、歐萊雅。所以中國的偉大發明可不能只限於四大發明,必須改成允許隨時新增的,想加幾個就加幾個。這種隨時新增對應於程式的可變引數,在Java體系中,可變引數採用“Object... args”的形式;在Kotlin體系中,新增了關鍵字vararg表示其後的引數個數是不確定的。以可變的字串引數為例,Java的寫法為“String... args”,而Kotlin的寫法為“vararg args: String?”,具體解析的時候,則把可變引數當作一個數組,迴圈取出每個引數值進行處理,相應的Kotlin程式碼如下所示:
    fun getFourBigVararg(general:String, first:String="造紙術", second:String="印刷術", third:String="火藥", fourth:String="指南針", vararg otherArray: String?):String {
        var answer:String = "$general:$first,$second,$third,$fourth"
        for (item in otherArray) {
            answer = "$answer,$item"
        }
        return answer
    }
這樣好了,同一個函式既可以輸入四大發明,還可以輸出七大發明,哪天你給弄個十大發明也是允許的。下面是帶有可變引數的函式呼叫程式碼:
    btn_param_vararg.setOnClickListener {
        tv_four_answer.text = if (isOdd) getFourBigVararg("古代的四大發明") else getFourBigVararg("古代的七大發明","造紙術","印刷術","火藥","指南針","絲綢","瓷器","茶葉")
        isOdd = !isOdd
    }
話說中國文化博大精深,除了物質上的發明,另有不少技藝上的發明,例如國畫、中醫、武術等等,哪個不是國之瑰寶?因此,可變引數也要支援輸入這些技巧性的發明,當然為了跟物質性的發明區分開,最好分門別類,把物質性的發明分為一組,技巧性的發明一組。如此一來,可變引數就成了可變的陣列引數,同樣宣告陣列引數時也要加上vararg字首,告訴編譯器後面的陣列個數是變化的。對應的函式宣告程式碼修改如下:
    fun getFourBigArray(general:String, first:String="造紙術", second:String="印刷術", third:String="火藥", fourth:String="指南針", vararg otherArray: Array<String>):String {
        var answer:String = "$general:$first,$second,$third,$fourth"
        for (array in otherArray) {
            for (item in array) {
                answer = "$answer,$item"
            }
        }
        return answer
    }
對於陣列形式的可變引數,進行函式呼叫時得按照陣列輸入了,示例程式碼如下:
    btn_param_array.setOnClickListener {
        tv_four_answer.text = if (isOdd) getFourBigArray("古代的四大發明") else getFourBigArray("古代的N大發明","造紙術","印刷術","火藥","指南針",arrayOf("絲綢","瓷器","茶葉"),arrayOf("國畫","中醫","武術"))
        isOdd = !isOdd
    }

總結一下,Kotlin引入了C++的預設引數概念,並加以擴充套件允許通過命名引數指定修改某個引數值,而Java是不存在預設引數概念的。另外,Kotlin對Java的可變引數功能進行了增強,不但支援普通型別的可變引數,而且支援陣列型別的可變引數。


點此檢視Kotlin入門教程的完整目錄


__________________________________________________________________________
本文現已同步釋出到微信公眾號“老歐說安卓”,開啟微信掃一掃下面的二維碼,或者直接搜尋公眾號“老歐說安卓”新增關注,更快更方便地閱讀技術乾貨。

相關推薦

Kotlin入門(10)輸入引數

上一篇文章介紹了Kotlin對函式的基本用法,包括函式的定義、輸入引數的宣告、輸出引數的宣告等等,這些足夠對付簡單的場合了。當然了,倘若一門新語言僅僅滿足於這些雕蟲小技,那也實在沒什麼前途。既然Kotlin志在取代Java,就必須練成Java所不具備的功夫。本篇文章便從函式的

【路漫漫,水迢迢】八一難攔路制敵

專欄達人 授予成功建立個人部落格專欄

孫悟空的是那般?--java型別的揭祕

故事背景   在《西遊記》原著第六回,孫悟空大鬧天宮反下界,玉帝派十萬天兵圍剿,卻被打得落花流水。玉帝不得不放下架子,請自己外甥二郎神回來支援。孫悟空與二郎神本事差不多,兩人鬥得不分勝負,但二郎神有梅山六兄弟助陣,而孫的陣營只是烏合之眾。兩人戰鬥正酣時,孫悟空聞後方陣營攻破,猴子被打散,心中發慌敗下陣來。

ElasticSearch最佳入門實踐()Java 實戰 - 對員工資訊進行復雜的搜尋操作

需求: (1)搜尋職位中包含technique的員工 (2)同時要求age在30到40歲之間 (3)分頁查詢,查詢第一頁 1、構建員工資訊 public class EmployeeSearchApp { public static void main

ElasticSearch最佳入門實踐()Java 實戰

需求: (1)搜尋職位中包含technique的員工 (2)同時要求age在30到40歲之間 (3)分頁查詢,查詢第一頁 1、構建員工資訊 public class EmployeeSearchApp { public static void ma

salesforce零基礎學習()項目中的零碎知識點小總結(一)

gin 不同 grant dmi ima -m ron 角色 com 項目終於告一段落,雖然比較苦逼,不過也學到了好多知識,總結一下,以後當作參考。 一.visualforce標簽中使用html相關的屬性使用 曾經看文檔沒有看得仔細,導致開發的時候走了一些彎路。還好得到

Linux學習總結()虛擬化之kvm

虛擬機克隆 sel rap hat 額外 模塊 destroy start -s 一 虛擬化介紹 1 常見虛擬化軟件VMware系列VMware workstation、VMware vsphere(VMware esxi)、VMware Fusion(Mac) Xen 開

、告警系統郵件引擎、運行告警系統

span sbin 項目 bold 目的 一個 Coding smt mtp 七十二、告警系統郵件引擎、運行告警系統一、告警系統郵件引擎mail.sh內容 //其中mail.py內容到這裏下載https://coding.net/u/aminglinux/p/ami

DAY66-前端入門-javascript() vue02

選中 log 條件 p2p bin true day6 eth spl 一.文本操作指令 采用文本指令後,頁面標簽的內容由vue實例來控制。 1.v-text <!-- 原文本會被msg替換 --> <p v-text=‘msg‘></p>

斯坦福大學-自然語言處理入門 筆記 第課 詞性標註(Part-of-speech tagging)

一、詞性(part-of-speech)介紹 詞性:名詞(Nouns),動詞(Verbs),形容詞(Adjectives), 副詞(Adverbs)等等就是我們想要研究的詞性 我們可以把詞性分為開放類(open class)和閉合類(closed class)。

一個屌絲程式猿的人生(

  一日過去。   林蕭一早就爬了起來。   明天就要參加招聘會了,而他今天最重要的任務,就是寫簡歷。   說起寫簡歷,林蕭這二十多年來,也就寫過一次,就是當初在鄭州霸面的時候,林蕭費盡心思的寫過一次簡歷。   那一次寫簡歷的過程,林蕭可謂是絞盡了腦汁。   原因很簡單,一個對於技術一

Java程式設計師從笨鳥到菜鳥之()細談Spring(四)利用註解實現spring基本配置詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

名詞解釋第講:軟分叉

這裡是王團長區塊鏈學院,與最優秀的區塊鏈人一起成長!今天給大家講講軟分叉。   區塊鏈上節點眾多,當出現新版軟體後,不一定所有的節點都願意升級,也不一定所有的節點都能馬上反應過來。節點面對新版軟體反應的不同,造成的分叉結果也不同。   根據升級後的區塊鏈是否能相容

【PP生產訂單】入門介紹(

這一講我們主要來介紹一下生產訂單的收貨。 Goods Receipt 成品入庫: 下圖則是收貨後會產生哪些影響。 1、啟用WMS模組的話會產生一個貨倉轉移需求。 2、列印收貨單。 3、影響庫存數量及價值。 4、產生物料文件。 5、產生財務文件。 6、產

文字記錄 家房客人物當中有趣的角色

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux真小白入門教程第集——使用者檔案及使用者組

Linux沿用了Unix檔案許可權的方法,允許使用者和組根據每個檔案和目錄的安全性設定來訪問檔案。Linux安全系統的核心是使用者賬戶,每個進入Linux的使用者都會被分配唯一的使用者賬戶,使用者對系統中各種物件的訪問許可權取決於他們登入時所用的賬戶。 使用者許可權是通過建立使用者時分配的使

Spring Boot 初級入門教程() —— 執行、測試、打包過程中碰到的各種錯誤

錯誤一:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project test-springboot: Compilation fail

另一個樹的子樹(leetcode簡單篇五百題)

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。 示例 1: 給定的樹 s: 3 / \ 4 5 / 1 2 給定的樹 t:

【OpenCV入門教程之】OpenCV邊緣檢測 Canny運算元 Sobel運算元 Laplace運算元 Scharr濾波

                本篇文章中,我們將一起學習OpenCV中邊緣檢測的各種運算元和濾波器——Canny運算元,Sobel運算元,Laplace運算元以及Scharr濾波器。文章中包含了五個淺墨為大家準備的詳細註釋的博文配套原始碼。在介紹四塊知識點的時候分別一個,以及最後的綜合示例中的一個。文章末尾

【Visual C 】遊戲開發筆記 遊戲輸入訊息處理 一 鍵盤訊息處理

                ------------------------------------------------------------------------------------------------------------------------------淺墨歷時一年為遊戲程式設計