【问题标题】:How to set a parameter default value to be a pure function of another parameter value?如何将参数默认值设置为另一个参数值的纯函数?
【发布时间】:2017-02-03 02:26:49
【问题描述】:

假设我们要定义 3 个整数参数的案例类 Abcdbc 必须指定,d 被指定或默认等于c + 1

我会这样定义:

case class A(b: Int, c: Int, d = c + 1)

但这不起作用。正确的形式是什么?

据我所知,这在 Scala 中是可能的,但我不记得如何做到这一点。

【问题讨论】:

  • 我不确定这在 Scala 中是否可行。一种选择是在其伴随对象中为A 定义一个apply,该对象接受两个参数并将默认值设置为最后一个值。
  • @JSchlather 就是这样。将此作为答案提交,我会批准。
  • @JSchlather 有可能,只是对案例类没有那么有用。
  • @AlexeyRomanov 嗯,我看到我也在尝试使用括号,但无法让它工作。您必须将其标记为 val 才能使其正常工作。你知道这是为什么吗?
  • @JSchlather 它可以在没有val 的情况下工作,但它只是一个普通的构造函数参数:它只能在类的主体内使用。案例类只会自动生成第一个列表val中的参数。

标签: scala class default-value


【解决方案1】:

一个简单的解决方案是对具有所需替换的伴随对象进行应用。

case class A(b: Int, c:Int, d: Int)

object A {
   def apply(b: Int, c:Int): A = A(b, c, c + 1)
}

【讨论】:

    【解决方案2】:
    case class A(b: Int, c: Int)(val d: Int = c + 1)
    
    A(1, 1)().d // 2
    

    但是!对于方法和非case 类,这是一个很好的解决方案。但是,对于案例类,这几乎肯定不会满足您的要求,因为自动生成的方法(equalshashCodeapplyunapply)只关心第一个参数列表。所以对于这种情况,请遵循@JSchlather 的建议。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2018-01-22
      • 2015-11-05
      • 1970-01-01
      • 2013-01-01
      • 2010-10-28
      • 2016-05-03
      相关资源
      最近更新 更多