我正在尝试为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客户端的任何帮助!
答案 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))
调用第二种方法。
请注意,覆盖与重载不同。覆盖是指将具有相同签名(相同名称,参数类型,返回类型)的方法定义为从另一个类或特征继承的方法。重载是指您创建具有相同名称但具有不同参数的不同方法(我猜这与此问题相关)。