使用占位符参数的函数应该只有单条语句
2016-07-22 本文已影响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!