kotlin作用域函数run的闭包返回
在学习Rust语言的时候,看到一个很有意思的语法:
fn main(){
let mut counter = 0;
let result = loop{
counter += 1;
if counter == 10 {
break counter * 2;
}
};
print!("The result is: {}",result);
}
其中let result = loop { ... }
和break counter * 2;
这个语法很有意思。通过循环算出来的一个值赋给了一个变量,个人感觉这种写法非常优雅。
那么在Kotlin中有没有类似的优雅的实现方法呢?当然是有的,它就是作用域函数run。例子如下:
fun main() {
val result = run {
var counter = 0
while (true) {
counter++
if (counter == 10) {
return@run counter * 2
}
}
}
println("The result is : $result")
}
Kotlin中的val result = run { ... }
和return@run counter * 2
有异曲同工之妙。计算result
用到的临时变量并没有在与result
同级的作用域中出现。Kotlin的语法也非常优雅。
另:在kotlin中result被推断为Any类型,在rust中,result被推断为i32类型.并且把条件改为count==-10后,kotlin和rust全部通过编译.kotlin输出 The result is : -20;而rust输出 thread 'main' panicked at 'attempt to add with overflow' 溢出
如果rust改成这样:
let result = loop{
counter += 1;
if counter==10{
break "hello"
}
if counter == -10 {
break counter * 2;
}
};
result推断为&str,编译不通过
如果rust改成这样:
let result = loop{
counter += 1;
if counter == -10 {
break counter * 2;
}
if counter==10{
break "hello"
}
};
result推断为i32,编译不通过
如果kotlin改成这样:
val result = run {
var counter = 0
while (true) {
counter++
if (counter == 10 ){
return@run "hello"
}
if (counter == -10) {
return@run counter * 2
}
}
}
或者这样:
val result = run {
var counter = 0
while (true) {
counter++
if (counter == -10) {
return@run counter * 2
}
if (counter == 10 ){
return@run "hello"
}
}
}
result都被推断为Any类型,都会通过编译,且输出为The result is : hello