【问题标题】:Difference between underscore (_) and triple question marks (???) in scalascala中下划线(_)和三重问号(???)之间的区别
【发布时间】:2017-05-23 07:12:29
【问题描述】:

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

object HbaseStore {
  def get() = _
}

但是上面的代码抛出了异常

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

[INFO] def get() = _

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

【问题讨论】:

  • Scala 下划线_提供默认值。它实际上有很多用途/含义,其中一些可以找到here

标签: scala syntax


【解决方案1】:

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

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)

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

另一方面,??? 作为值分配给方法或变量,以防您不想提供实现。

例如def doSomething() => ??? 这里,doSomething() 方法没有实现,后面需要提供或者重写实现。请注意,您不能在没有实现的情况下使用变量/方法,并且在您尝试调用它时会出现异常。例如doSomething() 在上述情况下会失败。

【讨论】:

  • 谢谢@Ra Ka。感谢您的回答
  • @sachinjain024 值得注意的是,??? 实际上并不是像 _ 这样的特殊语法。 ???只是scala.predef中定义的一个方法
【解决方案2】:

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

def ??? : Nothing = throw new NotImplementedError

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

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 2013-12-16
    • 2013-06-16
    • 1970-01-01
    • 2022-11-13
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多