【问题标题】:Scala: default value in case class constructor doesn't workScala:如果类构造函数不起作用的默认值
【发布时间】:2014-07-28 09:54:48
【问题描述】:

我正在使用默认值构造函数创建一个案例类:

abstract class Interaction extends Action
case class Visit(val url: String)(val timer: Boolean = false) extends Interaction

但是,例如,如果不使用它的所有参数,我就无法创建它的任何实例。如果我写:

Visit("https://www.linkedin.com/")

编译器会报错:

missing arguments for method apply in object Visit;
follow this method with `_' if you want to treat it as a partially applied function
[ERROR]     Visit("http://www.google.com")

我需要做什么来修复它?

【问题讨论】:

  • 您是否有理由使用currying(例如here)来定义它?如果没有,如下所示,您可以在第一组中定义所有参数,您的默认设置将按要求工作。如果您需要柯里化/第二组参数,那么额外的一组括号将导致应用该组参数的默认值。

标签: scala default-value currying


【解决方案1】:

你需要告诉编译器这不是一个部分应用的函数,而是你想要第二组参数的默认值。只需打开和关闭括号...

scala> Visit("https://www.linkedin.com/")()
res1: Visit = Visit(https://www.linkedin.com/)

scala> res1.timer
res2: Boolean = false

编辑解释@tribbloid评论。

如果您使用 _,则不是创建访问,而是创建部分应用的函数,然后可以使用该函数创建访问对象:

val a = Visit("asdsa")_ // a is a function that receives a boolean and creates and Visit
a: Boolean => Visit = <function1> 

scala> val b = a(true) // this is equivalent to val b = Visit("asdsa")(true)
b: Visit = Visit(asdsa)

【讨论】:

  • 非常感谢!我推测部分应用的函数应该总是有一个 _ 以防歧义。看来我错了,这是唯一的选择。
  • scala 的一个有趣的特性是,在旧特性和新特性之间出现歧义的情况下,旧特性总是获胜而新特性被牺牲掉。作为括号声明的元组上的运算符的中缀方法永远不会起作用,因为编译器认为这些括号是优先括号:)
  • @tribbloid,请参阅我的编辑。我希望它能澄清你的疑问。
  • 我以前在其他地方看到过这个规则,这就是为什么我很困惑,因为如果这是定义 PAF 的唯一方法,那么 Visit("Something") 将没有歧义。 Scala 有一些奇怪的规则来判断你是否需要 _
  • 还有一个问题:我可以通过在第二个参数上使用隐式分隔符来克服这个问题,但这会有副作用吗?
【解决方案2】:

请更正在您的案例类中指定可选字段的语法如下

case class Visit(val url: String,val timer: Boolean = false) extends Interaction

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 2018-08-30
    • 1970-01-01
    • 2017-11-10
    • 2014-02-25
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多