【问题标题】:Patterns for same method & same parameters but different parameter names in scalascala中相同方法和相同参数但参数名称不同的模式
【发布时间】:2018-01-09 04:48:53
【问题描述】:

我希望能够做到:

object AddOrSubtract {
  def apply(x: Int, adding: Int) = x + adding
  def apply(x: Int, subtracting: Int) = x - subtracting
}

AddOrSubtract(1, adding = 5) // should be 6
AddOrSubtract(1, subtracting = 5) // should be -4

但我得到了错误:

Error:(1331, 7) method apply is defined twice;
  the conflicting method apply was defined at line 1330:7
  def apply(x: Int, subtracting: Int) = x - subtracting

我知道这是因为这两种方法具有相同的签名。有什么模式可以解决这个问题吗?我唯一能想到的就是使用隐式来改变值的类型,比如:

object AddOrSubtract {
  implicit class AddInt(val x: Int)
  implicit class SubInt(val x: Int)

  def apply(x: Int, adding: AddInt) = x + adding.x
  def apply(x: Int, subtracting: SubInt) = x - subtracting.x

  def run(): Unit = {
    AddOrSubtract(1, adding = 5)
    AddOrSubtract(1, subtracting = 5)
  }
}

但我很好奇是否还有其他不那么优雅的方式来实现这一点?

【问题讨论】:

  • 只能使用一个参数,减法为负数,加法为正数
  • 您为什么要这样做?在对象名称中加上“或”是设计不佳的症状,除非在非常特殊的情况下。在这个例子中你显然有两个对象,Add 和 Substract,可能有一个通用的操作接口或类似的东西。
  • 感谢您对我的设计 volia17 质量的反馈,但该示例只是对我试图解决的问题的简化演示。

标签: scala


【解决方案1】:

对于您的实际用例,您的示例代码可能过于简化。如果是这样,则此解决方案将不适用。

object AddOrSubtract {
  def apply(x: Int, adding: Int=0, subtracting: Int=0) = x + adding - subtracting
}

AddOrSubtract(1, adding = 5)      // res0: Int = 6
AddOrSubtract(1, subtracting = 5) // res1: Int = -4

【讨论】:

    【解决方案2】:

    AFAIK 没有好的解决方案。 我能想到的唯一解决方法是

      object AddOrSubtract {
        def apply(x: Int, adding: Int = 0, subtracting: Int = 0) = 
          match (adding, subtracting) {
            case (0, 0) => throw Error("either adding or subtracting is required")
            case (x, 0) => x + adding
            case (0, x) => x - subtracting
           case (_, _) => throw Error("for now both adding and subtracting is not allowed")
       }
    
     AddOrSubtract(1, adding = 5) // should be 6
     AddOrSubtract(1, subtracting = 5) // should be -4
    

    但远非完美

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多