【问题标题】:Scala constructor with default arg referencing another arg具有默认 arg 引用另一个 arg 的 Scala 构造函数
【发布时间】:2011-12-11 16:13:26
【问题描述】:

我想让第二个构造函数参数可选,并在这种情况下使用第一个参数的值。有什么办法可以做到吗?此代码无法编译,因为它找不到realUser

class CurrentUser(val realUser:String, val masqueradeUser:String = realUser)

我确定我可以通过编写自己的构造函数来解决它,但我想知道是否有更简洁的方法。实际上,现在我已经尝试编写自己的构造函数,这还不错:

class CurrentUser(val realUser:String, val masqueradeUser:String) {
    def this(realUser:String) = this(realUser, realUser)
}

如果有人能想出更短的东西那就太好了,否则我会发布我自己的答案。

【问题讨论】:

    标签: scala constructor


    【解决方案1】:

    感谢您的建议。我想我会坚持手动指定第二个构造函数形式。为了完整起见,这是一个答案。

    class CurrentUser(val realUser:String, val masqueradeUser:String) {
        def this(realUser:String) = this(realUser, realUser)
    }
    

    【讨论】:

      【解决方案2】:

      您不能将同一参数列表中的参数用作默认参数。 didierd 的解决方案有效,并且可能您使用第二个构造函数的解决方案是最优雅的。这是第三种选择,它使用可怕的null

      scala> class CurrentUser(val realUser:String, _masqueradeUser: String = null) {
           |   val masqueradeUser = if (_masqueradeUser == null) realUser else _masqueradeUser
           | }
      defined class CurrentUser
      
      scala> new CurrentUser("paul").masqueradeUser
      res1: String = paul
      
      scala> new CurrentUser("paul", "p").masqueradeUser
      res2: String = p
      

      如果您想避免null,如果您不介意开销,可以使用Opt[A]discussed here。不管怎样,我还是会选择你的第二个构造函数解决方案。

      【讨论】:

        【解决方案3】:

        我相信您使用辅助构造函数的解决方案是更好的解决方案。参数在其自己的参数列表中不可见,仅在以下参数列表中可见。所以你必须这样做

        class CurrentUser(val realUser: String)(val masqueradeUser: String = realUser)
        

        然后用

        调用
        new CurrentUser(real)()
        

        不太好。

        【讨论】:

        • 酷 - 我以前从未真正使用过多个参数列表。你是对的,也许这不是使用它们的地方:)
        猜你喜欢
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多