Scala - 使用默认参数减少重载
Scala - reducing overloading with default parameters
我正在编写一个方法,其中一些参数应该有默认值,但重载似乎是一个不雅的解决方案。该方法将 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")
我正在编写一个方法,其中一些参数应该有默认值,但重载似乎是一个不雅的解决方案。该方法将 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")