Android 为什么有时表示整个字符串,有时表示Kotlin中的每个字符?
在代码A中,这是电子邮件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
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”中,所以它不会被筛选。谢谢。请你看看我在问题中添加的内容好吗?如果我使用其他扩展名funmyFun
,为什么可以得到正确的结果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'
}))