我正在编写一些代码,所以我想留下一个未实现的方法,我正在调用但是路径流并没有根据我提供的输入命中。该方法看起来像这样
object HbaseStore {
def get() = _
}
但上面的代码引发了异常
HbaseStore.scala:24:错误:未绑定的占位符参数
[INFO] def get()= _
但是当我用_
代码执行成功替换???
时。我很想知道这两者之间有什么区别。据我所知,_
提供了默认值,所以我假设它会在这里定义一个空函数并返回Nothing
。
答案 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
是任何给定类型的子类型,因此它可以工作。