作用域函式
這些函式基本上做了同樣的事情:在乙個物件上執行乙個**塊。
下面是作用域函式的典型用法:12
34val adam = person("adam")
adam.age = 20
adam.city = "london"
println(adam)
作用域函式沒有引入任何新的技術,但是它們可以使你的**更加簡潔易讀。
事實上,同樣的功能可能多個作用域函式都能實現,但我們應該根據不同的場景和需求來使用合適的作用域函式,以求更優雅的實現。
如果想直接檢視作用域函式之間的區別與使用場景歸納表,這裡。
下面我們將詳細描述這些作用域函式的區別及約定用法。
區別作用域函式之間有兩個主要區別:
引用上下文物件的方式
返回值引用上下文物件的方式:this 還是 it
在作用域函式的 lambda 表示式裡,上下文物件可以不使用其實際名稱而是使用乙個更簡短的引用(this 或 it)來訪問。
作用域函式引用上下文物件有兩種方式:
使用場景:主要對上下文物件的成員進行操作(訪問屬性或呼叫函式)。
let 及 also 將上下文物件作為 lambda 表示式引數。如果沒有指定引數名,物件可以用隱式預設名稱 it 訪問。it 比 this 簡短,帶有 it 的表示式通常更容易閱讀。然而,當呼叫物件函式或屬性時,不能像 this 這樣隱式地訪問物件。
使用場景:主要對上下文物件進行操作,作為引數使用。12
3456
fun getrandomint(): int
}val i = getrandomint()
此外,當將上下文物件作為引數傳遞時,可以為上下文物件指定在作用域內的自定義名稱(為了提高**的可讀性)。12
3456
fun getrandomint(): int
}val i = getrandomint()
返回值根據返回結果,作用域函式可以分為以下兩類:
返回上下文物件12
3456
7fun getrandomint(): int
}val i = getrandomint()
返回lambda表示式結果
let、run 及 with 返回 lambda 表示式的結果。所以,在需要使用其結果給乙個變數賦值,或者在需要對其結果進行鏈式操作等情況下,可以使用它們。12
3456
7val numbers = mutablelistof("one", "two", "three")
val countendswithe = numbers.run
}println("there are $countendswithe elements that end with e.")
此外,還可以忽略返回值,僅使用作用域函式為變數建立乙個臨時作用域。12
3456
val numbers = mutablelistof("one", "two", "three")
with(numbers)
約定用法
let上下文物件 作為 lambda 表示式的 引數(it)來訪問。 返回值 是 lambda 表示式的結果。
let 可用於在呼叫鏈的結果上呼叫乙個或多個函式。例如,以下**列印對集合的兩個操作的結果:12
3val numbers = mutablelistof("one", "two", "three", "four", "five")
val resultlist = numbers.map .filter
println(resultlist)
使用 let,可以寫成這樣:12
345val numbers = mutablelistof("one", "two", "three", "four", "five")
numbers.map .filter .let
若**塊僅包含以 it 作為引數的單個函式,則可以使用方法引用(::)代替 lambda 表示式:12
val numbers = mutablelistof("one", "two", "three", "four", "five")
numbers.map .filter .let(::println)
let 經常用於 僅使用非空值執行**塊。如需對非空物件執行操作,可對其使用安全呼叫操作符 ?. 並呼叫 let 在 lambda 表示式中執行操作。12
3456
7val str: string? = "hello"
//processnonnullstring(str) // 編譯錯誤:str 可能為空
val length = str?.let ' 中必不為空
it.length
}使用 let 的另一種情況是引入作用域受限的區域性變數以提高**的可讀性。如需為上下文物件定義乙個新變數,可提供其名稱作為 lambda 表示式引數來替預設的 it。12
3456
val numbers = listof("one", "two", "three", "four")
val modifiedfirstitem = numbers.first().let .touppercase()
println("first item after modifications: '$modifiedfirstitem'")
with
乙個非擴充套件函式:上下文物件作為引數傳遞,但是在 lambda 表示式內部,它可以作為接收者(this)使用。 返回值是lambda 表示式結果。
建議使用 with 來呼叫上下文物件上的函式,而不使用 lambda 表示式結果。 在**中,with 可以理解為「對於這個物件,執行以下操作。」12
345val numbers = mutablelistof("one", "two", "three")
with(numbers)
with 的另乙個使用場景是引入乙個輔助物件,其屬性或函式將用於計算乙個值。12
3456
val numbers = mutablelistof("one", "two", "three")
val firstandlast = with(numbers) ," +
" the last element is $"
}println(firstandlast)
run上下文物件 作為 接收者(this)來訪問。 返回值 是 lambda 表示式結果。
run 和 with 做同樣的事情,但是呼叫方式和 let 一樣——作為上下文物件的擴充套件函式.
當 lambda 表示式同時包含物件初始化和返回值的計算時,run 很有用。12
3456
78910
val service = multiportservice("", 80)
val result = service.run
// 同樣的**如果用 let() 函式來寫:
val letresult = service.let ")
}除了在接收者物件上呼叫 run 之外,還可以將其用作非擴充套件函式。 非擴充套件 run 可以使你在需要表示式的地方執行乙個由多個語句組成的塊。
上下文物件 作為 接收者(this)來訪問。返回值 是上下文物件本身。
also
上下文物件作為 lambda 表示式的引數(it)來訪問。 返回值 是上下文物件本身。
also 對於執行一些將上下文物件作為引數的操作很有用。 對於需要引用物件而不是其屬性與函式的操作,或者不想遮蔽來自外部作用域的 this 引用時,請使用 also。
當在**中看到 also 時,可以將其理解為「並且用該物件執行以下操作」。12
34val numbers = mutablelistof("one", "two", "three")
numbers
.also
.add("four")
Kotlin 13 作用域函式
目錄 1 定義 2 作用 3 函式 run 4 函式 let 5 函式 also 6 函式 takeif 7 函式 takeunless 8 函式 with 9 總結 物件的擴充套件函式。如下圖 1 紅色框內的就是pig物件所能呼叫的擴充套件函式 這些擴充套件函式對所有物件都適用 2 綠色框內就是r...
函式的作用域
一,每乙個變數都是有作用域的。1,首先講一下 塊與作用域 for,if等語句還有 function,他們都有乙個特點,就是後面有一對 比如 for var i 0 i items.length i 之間有 if some express 之間有 function param1 之間有 所有 包起來的...
函式的作用域
在php中,函式的作用域來控制函式及函式中的變數在 是可見並且可用的。不同的程式語言有不同的變數作用域規則,php中的函式及函式中的變數作用域規則如下 函式的作用域是指在函式內部宣告的變數作用域是從宣告的那條語句開始到函式的末尾 全域性作用域是指在函式外部宣告的變數作用域是從那條語句開始到宣告所在的...