【问题标题】:How can a parameter's default value reference another parameter?一个参数的默认值如何引用另一个参数?
【发布时间】:2013-06-15 16:36:44
【问题描述】:

一个参数的默认值如何引用另一个参数?如果不能,如何解决?

case class A(val x:Int, val y:Int = x*2)

错误(足够合理):

scala> case class B(val x:Int, val y:Int = x*2)
<console>:7: error: not found: value x
   case class B(val x:Int, val y:Int = x*2)
                                       ^

【问题讨论】:

    标签: scala scala-2.10


    【解决方案1】:

    这要求您使用多个参数列表:

    case class A(x: Int)(y: Int = x*2)
    

    默认值只能引用前面列表中的参数。

    但请注意案例类,因为它们的相等性只考虑第一个参数列表,因此:

    A(1)() == A(1)(3)  // --> true!!
    

    【讨论】:

    • 不错的答案。使用案例类时这是一个相当大的问题,截至 2.11.6 仍未修复。
    • 实际上,我认为能够定义不参与相等和哈希的参数是一个有用的功能。
    【解决方案2】:

    既然您要求解决方法,如果不清楚如何保持大小写:

    scala> :pa
    // Entering paste mode (ctrl-D to finish)
    
    case class Foo(x: Int, y: Int)
    object Foo {
      def apply(x: Int): Foo  = apply(x, 2*x)
    }
    
    // Exiting paste mode, now interpreting.
    
    defined class Foo
    defined object Foo
    
    scala> Foo(5,6)
    res45: Foo = Foo(5,6)
    
    scala> Foo(5)
    res46: Foo = Foo(5,10)
    

    【讨论】:

    • 我觉得这种方法更有用,但我给 0__ 的答案接受,因为它似乎更受欢迎。
    • 实际上,绿色检查应该意味着解决了您的问题,但是您定义它。但我猜你几年前就解决了你的问题。
    • 是的,回想起来,我不知道为什么我切换了绿色检查。
    猜你喜欢
    • 2019-04-14
    • 2015-03-30
    • 2014-04-19
    • 2015-11-05
    • 1970-01-01
    • 2017-02-03
    • 2016-05-03
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多