在代码中,这个它是电子邮件"yole@example.com",并在代码B,这也就是每一个字符'a','b','1','c'的"ab1c",为什么呢?
代码A.
fun main(args: Array<String>) {
var email: String? = "yole@example.com"
email?.let { sendEmailTo(it) } //This it is the email "yole@example.com"
}
fun sendEmailTo(email: String) {
println("Sending email to $email")
}
Run Code Online (Sandbox Code Playgroud)
代码B.
fun main(args: Array<String>) {
println("ab1c".filter { it in 'a'..'z' }) //This it is char 'a', 'b,' '1','c' of "ab1c"
}
fun String.filter(predicate: (Char) -> Boolean): String {
val sb = StringBuilder()
for (index in 0 until length) {
val element = get(index)
if (predicate(element)) sb.append(element)
}
return sb.toString()
}
Run Code Online (Sandbox Code Playgroud)
添加内容
代码C.
如果我使用其他扩展名有趣的名字,我会得到相同的结果.
fun main(args: Array<String>) {
println("ab1c".myFun { it in 'a'..'z' }) //This it is char 'a', 'b,' '1','c' of "ab1c"
}
fun String.myFun(predicate: (Char) -> Boolean): String {
val sb = StringBuilder()
for (index in 0 until length) {
val element = get(index)
if (predicate(element)) sb.append(element)
}
return sb.toString()
}
Run Code Online (Sandbox Code Playgroud)
更新的内容
我想这也代表了基于这些扩展有趣的细节.对?所以有时我需要阅读扩展乐趣的源代码!
这是在email?.let { sendEmailTo(it) }代表email因为好玩block要求这一点.
来源A.
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
Run Code Online (Sandbox Code Playgroud)
这是在"ab1c".filter { it in 'a'..'z' }代表字符,因为乐趣predicate需要在这个String对象char和做一个for循环操作.
来源B
fun String.filter(predicate: (Char) -> Boolean): String {
val sb = StringBuilder()
for (index in 0 until length) {
val element = get(index)
if (predicate(element)) sb.append(element)
}
return sb.toString()
}
Run Code Online (Sandbox Code Playgroud)
您可能知道,it指的是传递给闭包的单个参数.
filter接受类型的闭包(Char) -> Boolean,所以it类型是Char.之所以这样it,ab1c是因为如何filter实施.filter循环遍历序列并根据谓词检查每个元素.
let另一方面,这是一种完全不同的方法,因此他们的行为自然不同.let接受类型的闭包(String) -> Unit(假设sendEmail返回Unit).它所做的只是将闭包this作为参数调用,所以it指的是你调用的东西let.
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |