美文网首页首页投稿(暂停使用,暂停投稿)技术文程序员
使用占位符参数的函数应该只有单条语句

使用占位符参数的函数应该只有单条语句

作者: 浑身演技 | 来源:发表于2016-07-22 09:53 被阅读85次

    以下代码段的执行结果将会是?

    List(1,2).map { i => i + 1 }
    List(1,2).map { i => println("Hi"); i + 1 }
    List(1,2).map { _ + 1 }
    List(1,2).map { println("Hi"); _ + 1 }
    

    选项
    A. 输出

    List[Int] = List(2, 3)
    Hi
    List[Int] = List(2, 3)
    List[Int] = List(2, 3)
    Hi
    List[Int] = List(2, 3)
    

    B.输出

    List[Int] = List(2, 3)
    Hi
    Hi
    List[Int] = List(2, 3)
    List[Int] = List(2, 3)
    Hi
    Hi
    List[Int] = List(2, 3)
    

    C.输出

    List[Int] = List(2, 3)
    Hi
    Hi
    List[Int] = List(2, 3)
    List[Int] = List(2, 3)
    Hi
    List[Int] = List(2, 3)
    

    D.第一,二,三语句输出 ,第四语句编译失败

    List[Int] = List(2, 3)
    Hi
    Hi
    List[Int] = List(2, 3)
    List[Int] = List(2, 3)
    

    答案: C
    解释:
    map函数期望传入一个函数,因此代码块从本质上来说将会被构造成一个函数。在占位符表达式中,最后一条语句将会被构造成一个函数,其他的语句将会在构造函数的过程中执行一次。
    举例来说:

    map { println("hi"); _ + 1 }  // 将会选择 Int => Int 作为结果函数
    map { i => println("hi"); i+1 } //此处已经定义好结果函数
    

    由此占位符看起来一样,但在第二个拥有占位符语句里面却有不同的效果。从上面print语句不再是函数体的一部分了,而是构造函数的一部分。

    此题翻译自 Hi There!

    相关文章

      网友评论

        本文标题:使用占位符参数的函数应该只有单条语句

        本文链接:https://www.haomeiwen.com/subject/ojcijttx.html