Kotlin 語法基礎(chǔ)大全蛙埂,從例子著手的 從0到1的學(xué)習(xí) -- 作用域方法

Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 基礎(chǔ)介紹
Kotlin 語法基礎(chǔ)大全油啤,從例子著手的 從0到1的學(xué)習(xí) -- 流程控制
Kotlin 語法基礎(chǔ)大全评凝,從例子著手的 從0到1的學(xué)習(xí) -- 特殊的類
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 函數(shù)
Kotlin 語法基礎(chǔ)大全外邓,從例子著手的 從0到1的學(xué)習(xí) -- 集合
Kotlin 語法基礎(chǔ)大全撤蚊,從例子著手的 從0到1的學(xué)習(xí) -- 作用域
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 代理
Kotlin 語法基礎(chǔ)大全损话,從例子著手的 從0到1的學(xué)習(xí) -- 產(chǎn)品級特性
翻譯來源

let

let 是一個kotlin 的標(biāo)準(zhǔn)庫侦啸,可以用于實例檢查和null檢查,當(dāng)let被調(diào)用再一個實例上的時候丧枪,你可以通過it 來再作用域內(nèi)訪問這個實例光涂。作用域內(nèi)的最后一句表達式,將會作為返回值返回

fun customPrint(s: String) {
    print(s.toUpperCase())
}

fun main() {
    val empty = "test".let {               // 1
        customPrint(it)                    // 2
        it.isEmpty()                       // 3
    }
    println(" is empty: $empty")


    fun printNonNull(str: String?) {
        println("Printing \"$str\":")

        str?.let {                         // 4
            print("\t")
            customPrint(it)
            println()
        }
    }
    printNonNull(null)
    printNonNull("my string") 
}
/*
TEST is empty: false
Printing "null":
Printing "my string":
    MY STRING
*/
  • 1 在“test”上執(zhí)行這一個代碼塊拧烦,并且返回一個值作為結(jié)果
  • 2 調(diào)用一個方法忘闻,通過it訪問到“test”實例
  • 3 返回let代碼塊的返回值
  • 4 安全調(diào)用let代碼塊,只有當(dāng)str不為空是才會執(zhí)行l(wèi)et代碼塊恋博。

run

run 和let 很相似齐佳,執(zhí)行一個代碼塊私恬,返回一個結(jié)果。兩者不同的是 let中使用it 來訪問外部調(diào)用實例炼吴,而run中使用this 來訪問外部調(diào)用實例本鸣,這在嗲用外部調(diào)用實例的方法是會提供一些便捷。

fun main() {
    fun getNullableLength(ns: String?) {
        println("for \"$ns\":")
        ns?.run {                                                  // 1
            println("\tis empty? " + isEmpty())                    // 2
            println("\tlength = $length")                           
            length                                                 // 3
        }
    }
    getNullableLength(null)
    getNullableLength("")
    getNullableLength("some string with Kotlin")
}
/*

for "null":
for "":
    is empty? true
    length = 0
for "some string with Kotlin":
    is empty? false
    length = 23
*/
  • 1 在一個可控變量上執(zhí)行一個代碼塊
  • 2 不需要顯示的調(diào)用this.xxx 直接調(diào)用 isempty缺厉, 這里就相當(dāng)于調(diào)用 this.isEmpty()
  • 3 返回this.length

with

class Configuration(var host: String, var port: Int) 

fun main() {
    val configuration = Configuration(host = "127.0.0.1", port = 9000) 

    with(configuration) {
        println("$host:$port")
    }

    // instead of:
    println("${configuration.host}:${configuration.port}")    
}
/*
127.0.0.1:9000
127.0.0.1:9000
*/

with是一個非擴展方法永高,在with的作用域里,你可以簡潔地訪問到參數(shù)地成員提针,意思就是在作用域里面你可以隱藏實例地名字當(dāng)訪問屬性地時候命爬。


apply

apply 在一個實例上運行一段代碼,讓后將返回這個實例辐脖。在代碼塊中饲宛,實例可以用this來代替訪問。這個apply嗜价,可以簡單地用于初始化實例艇抠。

data class Person(var name: String, var age: Int, var about: String) {
    constructor() : this("", 0, "")
}

fun main() {
    val jake = Person()                                     // 1
    val stringDescription = jake.apply {                    // 2
        name = "Jake"                                       // 3
        age = 30
        about = "Android developer"
    }.toString()                                            // 4
    println(stringDescription)
}
//Person(name=Jake, age=30, about=Android developer)
  • 1 創(chuàng)建一個實例
  • 2 調(diào)用一個apply 代碼塊
  • 3 修改屬性
  • 4 apply返回地還是 這個實例,在這里可以調(diào)用 toString(), 這樣你就可以鏈?zhǔn)降卣{(diào)用久锥。

also

also 和apply的工作方式很像家淤,他執(zhí)行了一個代碼塊,然后返回這個實例瑟由。在代碼塊中絮重,你需要使用it來訪問這個實例,這是和apply不同的地方歹苦。所以這更像是用來執(zhí)行一個額外的工作青伤。比如在調(diào)用鏈中打印一些東西

data class Person(var name: String, var age: Int, var about: String) {
             constructor() : this("", 0, "")
}
         
fun writeCreationLog(p: Person) {
    println("A new person ${p.name} was created.")              
}
         
fun main() {
    val jake = Person("Jake", 30, "Android developer")   // 1
        .also {                                          // 2 
            writeCreationLog(it)                         // 3
        }
}
//A new person Jake was created.
  • 1 創(chuàng)建一個帶有屬性值的 Person
  • 2 調(diào)用also代碼塊,代碼塊的返回值就是他自己
  • 3 調(diào)用一個方法殴瘦,打印一些內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狠角,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚪腋,更是在濱河造成了極大的恐慌丰歌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屉凯,死亡現(xiàn)場離奇詭異动遭,居然都是意外死亡,警方通過查閱死者的電腦和手機神得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門厘惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事宵蕉≡途玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵羡玛,是天一觀的道長别智。 經(jīng)常有香客問我,道長稼稿,這世上最難降的妖魔是什么薄榛? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮让歼,結(jié)果婚禮上敞恋,老公的妹妹穿的比我還像新娘。我一直安慰自己谋右,他們只是感情好硬猫,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著改执,像睡著了一般啸蜜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辈挂,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天衬横,我揣著相機與錄音,去河邊找鬼终蒂。 笑死蜂林,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的后豫。 我是一名探鬼主播悉尾,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼突那,長吁一口氣:“原來是場噩夢啊……” “哼挫酿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愕难,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤早龟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猫缭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葱弟,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年猜丹,在試婚紗的時候發(fā)現(xiàn)自己被綠了芝加。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡射窒,死狀恐怖藏杖,靈堂內(nèi)的尸體忽然破棺而出将塑,到底是詐尸還是另有隱情,我是刑警寧澤蝌麸,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布点寥,位于F島的核電站,受9級特大地震影響来吩,放射性物質(zhì)發(fā)生泄漏敢辩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一弟疆、第九天 我趴在偏房一處隱蔽的房頂上張望戚长。 院中可真熱鬧,春花似錦兽间、人聲如沸历葛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恤溶。三九已至,卻和暖如春帜羊,著一層夾襖步出監(jiān)牢的瞬間咒程,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工讼育, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帐姻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓奶段,卻偏偏與公主長得像饥瓷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痹籍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容