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:作为其他参数的函数的可选默认参数的主要内容,如果未能解决你的问题,请参考以下文章