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

posted @ 2021-07-31 23:02  SoClear  阅读(434)  评论(0编辑  收藏  举报