首页投稿(暂停使用,暂停投稿)技术文程序员

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

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!

上一篇下一篇

猜你喜欢

热点阅读