Scala - 使用默认参数减少重载

标签 scala overloading

我正在编写一个方法,该方法应该具有某些参数的默认值,但重载似乎是一个不优雅的解决方案。该方法将 Network 作为第一个参数,NetworkNode 作为第二个参数,名称作为第三个参数,然后将这些参数传递给 Network 对象进行处理。但是,我希望 Network 和 name 参数都是可选的,并且如果未定义,则使用默认值;这是我的第一次尝试:

  // FIXME: addNode overloading is not elegant
  def addNode(node: NetworkNode) = latestNetwork.addNode(node, "")
  def addNode(node: NetworkNode, name: String) = latestNetwork.addNode(node, name)
  def addNode(network: Network, node: NetworkNode) = network.addNode(node, "")
  def addNode(network: Network, node: NetworkNode, name: String) = network.addNode(node, name)

不过,这看起来不太可读。我绝对希望将网络作为第一个参数,并且最好将其作为可选参数。但是,以下方法不起作用:

def addNode(network: Network = latestNetwork, node: NetworkNode, name: String = "") = network.addNode(node, name)

有办法解决这个问题吗?在模块化解决方案的背景下,像这样的默认值重载是否是一种通常被认为不好或不受欢迎的做法?

感谢您的宝贵时间。

最佳答案

您应该将必需参数放在前面,将可选参数放在最后。这使您可以使用位置参数或命名参数轻松调用该函数。许多语言要求可选参数位于最后。

如果您不想这样做,您可以在调用站点命名参数:

def addNode(network: Network = latestNetwork, node: NetworkNode, name: String = "") = network.addNode(node, name)

addNode(node = myNode, name = "myNode")

关于Scala - 使用默认参数减少重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34446648/

相关文章:

scala - 远程创建 Akka Actor,无需新的 ActorSystem

scala - 如何清空可变映射(由val定义)?

c++ - 无法将右值引用函数与 GCC 匹配

c++ - 将重载函数指针作为参数传递给重载模板函数

scala - 如何通过删除 Scala 中的一个元素从列表中获取所有可能的子列表?

java - 如何将 java 8 映射、过滤器和流转换为 scala?

c++ - 虚函数重载

java - 重载可变参数

scala - 播放框架 2.5.x : Inject Environment in a Module

c++ - (C++) 这些重载运算符函数有什么区别?