scala:作为其他参数的函数的可选默认参数

Posted

技术标签:

【中文标题】scala:作为其他参数的函数的可选默认参数【英文标题】:scala: optional default argument as function of other arguments 【发布时间】:2015-04-21 02:29:29 【问题描述】:

我有一个构造函数,它接受一个主要参数 (data) 和另一个参数 (model),它具有合理的默认初始化,这取决于主要参数。

我希望在适当的时候为model 提供另一个值。

一个简化的例子:

1) 没有默认参数:

class trainer(data:Int,model:Double) 

2) 初始化:

def init(data:Int): Double = 1.0/data

3) 如果初始化独立于其他参数,它将起作用:

class trainer(data:Int, model:Double = init(1)) 

4) 我想要什么,但是什么给出了错误:

class trainer(data:Int, model:Double = init(data)) 

实现我想做的最好/最接近的方法是什么?

(我的特殊情况涉及构造函数,但我很想知道在一般情况下是否也有函数的方法)

【问题讨论】:

一般来说,没有办法在函数中获取默认参数,至少如果您希望能够以函数类型表示默认行为,以便即使在间接使用。 【参考方案1】:

你可以简单地拥有一个重载的构造函数:

class Trainer(data:Int, model:Double) 
    def this(data:Int) = this(data, init(data))

然后你可以使用实例化:

new Trainer(4)
new Trainer(4, 5.0)

另一种方法是使用具有不同 apply 重载的伴随对象:

//optionally make the constructor protected or private, so the only way to instantiate is using the companion object
class Trainer private(data:Int, model:Double)

object Trainer 
    def apply(data:Int, model:Double) = new Trainer(data, model)
    def apply(data:Int) = new Trainer(data, init(data))

然后你可以使用实例化

Trainer(4)
Trainer(4, 5.0)

另一种方法是使用Option,默认为None,然后在类主体中初始化一个私有变量:

class Trainer(data:Int, model:Option[Double] = None) 
    val modelValue = model.getOrElse(init(data))

然后你使用实例化:

new Trainer(5)
new Trainer(5, Some(4.0))

【讨论】:

具有重载 apply 方法的伴随对象也可以添加更好的语法。 def apply(data: Int, model: Double) = trainer(data, Some(model))

以上是关于scala:作为其他参数的函数的可选默认参数的主要内容,如果未能解决你的问题,请参考以下文章

scala 基础四 scala 的函数扩展 默认参数,不定长参数,带名参数

compojure-api 的可选查询参数(具有默认值)

JavaScript中的可选参数[重复]

C#基础 可选参数调用params无参静态构造函数

Mathematica 中的可选命名参数

为具有更多限制性默认值的可选参数强制使用更广泛的类型