了解Scala方法重载,API客户端lib的可选/默认参数

时间:2011-06-10 14:52:56

标签: scala

我正在尝试为PrestaShop的Web服务编写Scala客户端库,而我在提供干净/用户友好的方法定义方面遇到了一些麻烦。基本上,我对Scala方法重载,可选/默认方法参数等没有足够的了解,以使其正确。

问题1

使用PrestaShop API,您可以删除一个资源ID或一组ID,因此我尝试使用基于类型的重载设置一对方法:

def delete(resource: String, id: Int) {
  deleteURL(apiURL + resource + "/" + id)
}

// But this second definition overrides the first!
def delete(resource: String, ids: Array[Int]) {
  deleteURL(apiURL + resource + "/?id=[%s]".format(ids.mkString(",")))
}

显然,我不了解基于类型的重载。我应该给方法不同的名称(deleteID,deleteIDs),还是有其他方法可以做到这一点?

问题2

使用PrestaShop API,您可以通过指定ID来“控制”一个资源,或者通过保留资源ID来处理一种类型的所有资源。此外,您可以通过传入“filter”=“xxx”等参数来优化头部。所以我试着提出一些像这样的可选参数:

def head(resource: String, id: Option[Int] = None, 
  params: Option[Map[String, String]]): String = {

  headURL(
    apiURL + resource + 
    (if (id.isDefined) "/" + id.get else "") + "?" + 
    (if (params.isDefined) canonicalize(validate(params.get)) else "")
  )
}

使用Options []的方法是否正确?据我了解,这意味着用户需要传入,例如一些(23)为head方法提供了23的id,而不是仅仅传入23.是否有更好的方法来做到这一点?

非常感谢您为我提供更好的API客户端的任何帮助!

2 个答案:

答案 0 :(得分:4)

问题1:

这是你在REPL中试过的吗?似乎是一个REPL的事情:

  Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> def delete(resource : String, id : Int) = 1
  delete: (resource: String, id: Int)Int

  scala> def delete(resource : String, ids : Array[Int]) = 2
  delete: (resource: String, ids: Array[Int])Int

  scala> delete("foo", 1)
  <console>:9: error: type mismatch;
   found   : Int(1)
   required: Array[Int]
         delete("foo", 1)
                       ^

在编译的文件中,它很好用:

def delete(resource : String, id : Int) = 1
def delete(resource : String, ids : Array[Int]) = 2

val x = delete("id", 1)
val y = delete("id", Array(1, 2))

没有错误......

问题2:

为什么不呢?我不会说这是一个选项的典型用例。你可以只使用额外的方法:

def head(resource: String, id: Int, params: Option[Map[String, String]]) =
  head(resource, Some(id), params)

def head(resource: String, params: Option[Map[String, String]]) =
  head(resource, None, params)

并制作您私密的那个。我想这取决于......

答案 1 :(得分:1)

关于问题1,我不确定问题是什么。

看起来你已经超载了delete就好了。您可以使用delete("a resource", 1)调用第一种方法,或使用delete("a resource", Array(1, 2, 3))调用第二种方法。

请注意,覆盖与重载不同。覆盖是指将具有相同签名(相同名称,参数类型,返回类型)的方法定义为从另一个类或特征继承的方法。重载是指您创建具有相同名称但具有不同参数的不同方法(我猜这与此问题相关)。