Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么有时表示整个字符串,有时表示Kotlin中的每个字符?_Android_Kotlin - Fatal编程技术网

Android 为什么有时表示整个字符串,有时表示Kotlin中的每个字符?

Android 为什么有时表示整个字符串,有时表示Kotlin中的每个字符?,android,kotlin,Android,Kotlin,在代码A中,这是电子邮件yole@example.com“,在代码B中,它是'a','B','1','c',为什么 代码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: St

在代码A中,这是电子邮件yole@example.com“,在代码B中,它是
'a'
'B'
'1'
'c'
,为什么

代码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")
}
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}
“ab1c”中的it

来源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()
}
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()
}

您可能知道,
it
引用传递到闭包中的单个参数

filter
接受类型为
(Char)->Boolean的闭包,因此
它的类型是
Char
it
之所以是
ab1c
中的每个字符,是因为
filter
是如何实现的
filter
循环遍历序列,并根据谓词检查每个元素

另一方面,
let
是一种完全不同的方法,因此它们的行为不同是很自然的
let
接受类型为
(String)->Unit
(假设
sendmail
返回
Unit
)的闭包。它所做的就是调用闭包,以
this
作为参数,因此
it
引用了您调用的
let
开启的方法。

这两种方法:

email?.let { sendEmailTo(it) }  //This it is the email "yole@example.com"
println("ab1c".filter { it in 'a'..'z' })  //This it is char  'a', 'b,' '1','c' of "ab1c"
相当于:

email?.let(fun (string: String) {
    sendEmailTo(string)
})

println("ab1c".filter(fun (char: Char): Boolean {
    return char in 'a'..'z'
}))

如您所见,
it
在第一个方法中引用
string
,在第二个方法中引用
char
。它们是两种不同的东西,只是为了方便起见可以用
it
来表示。

谢谢!在代码B中,为什么系统将字符串“ab1c”拆分为它?为什么系统不将其他字符串(如“vbnm”)拆分成它呢?系统没有拆分字符串,而是拆分它(在
字符串.filter
中)。字符串“vbnm”也是“拆分”的,但因为谓词正在测试
字符是否在“a”…“z”
,而“vbnm”都在“a”…“z”中,所以它不会被筛选。谢谢。请你看看我在问题中添加的内容好吗?如果我使用其他扩展名fun
myFun
,为什么可以得到正确的结果
filter
是正常的扩展乐趣,就像
myFun
一样。与函数名无关。
循环完成了筛选。谢谢!你能看看我在问题中添加的内容吗?@HelloCW我看到了。关于代码C,您想问什么问题?filter是正常的扩展乐趣,就像问题中我添加的内容中的myFun一样
filter
接受一个Char参数并返回Boolean,为什么
filter
会操作“ab1c”?如果有一些代码像
(这里是Char)->Boolean
,它会更清晰哦,我明白你的意思了!你想让方法声明更清晰,对吗?我认为没有办法把它说得更清楚。无论如何,没有其他的可能性。当你说“过滤一个字符串”时,我会自动想到根据谓词测试每个字符,并删除那些匹配的字符。你真的不需要花太多的心思去理解闭包的目的。当存在歧义时,您还可以编写文档@你好,您可以定义自己的
字符串
扩展函数,并让
表示您想要的任何意思。预定义的函数也一样。
email?.let(fun (string: String) {
    sendEmailTo(string)
})

println("ab1c".filter(fun (char: Char): Boolean {
    return char in 'a'..'z'
}))