scala中下划线(_)和三重问号(???)之间的区别

时间:2017-05-23 07:12:29

标签: scala syntax

我正在编写一些代码,所以我想留下一个未实现的方法,我正在调用但是路径流并没有根据我提供的输入命中。该方法看起来像这样

object HbaseStore {
  def get() = _
}

但上面的代码引发了异常

  

HbaseStore.scala:24:错误:未绑定的占位符参数

     

[INFO] def get()= _

但是当我用_代码执行成功替换???时。我很想知道这两者之间有什么区别。据我所知,_提供了默认值,所以我假设它会在这里定义一个空函数并返回Nothing

2 个答案:

答案 0 :(得分:4)

_是占位符语法,用于绑定值。占位符语法在许多场景中使用,例如: 如果是列表:

val x = List(1,2,3,4,5)
//To print each value we can do:
x.map(res => println(res)) 
//Now, we can use placeholder syntax to bind res value.
x.map(println(_)) 

模式匹配:

val x = "some value"
x match {
case x:String => //convert to lowercase and print.
case res@_ => //here, type doesnot matter I just want to get that value and print as it is. println(res)

因此,基本上,如果您想要在不知道其类型的情况下获取值,则使用占位符语法。

另一方面,???被指定为方法或变量作为值,以防您不想提供实施。

e.g。 def doSomething() => ??? 这里,doSomething()方法未实现,您需要稍后提供或覆盖实现。请注意,如果没有实现,则无法使用变量/方法,并且在尝试调用它时会出现异常。例如在上述情况下,doSomething()将失败。

答案 1 :(得分:2)

如果要将_用作默认值,则需要提供此值的类型。例如,var x: Any = _将使用null进行初始化,但var x: Int = _将使用0进行初始化。 关于???: 您可以单击IDE中???的定义:

def ??? : Nothing = throw new NotImplementedError

由于Nothing是任何给定类型的子类型,因此它可以工作。