scala:可选的默认参数作为其他参数的函数
scala: optional default argument as function of other arguments
我有一个构造函数,它接受一个主要参数 (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)) {}
best/closest 实现我想做的事情的方法是什么?
(我的特殊情况涉及构造函数,但我很想知道在一般情况下函数是否也有方法)
您可以简单地重载构造函数:
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)
另一种方法是使用默认值为None
的Option
,然后在class主体中初始化一个私有变量:
class Trainer(data:Int, model:Option[Double] = None) {
val modelValue = model.getOrElse(init(data))
}
然后你实例化使用:
new Trainer(5)
new Trainer(5, Some(4.0))
我有一个构造函数,它接受一个主要参数 (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)) {}
best/closest 实现我想做的事情的方法是什么?
(我的特殊情况涉及构造函数,但我很想知道在一般情况下函数是否也有方法)
您可以简单地重载构造函数:
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)
另一种方法是使用默认值为None
的Option
,然后在class主体中初始化一个私有变量:
class Trainer(data:Int, model:Option[Double] = None) {
val modelValue = model.getOrElse(init(data))
}
然后你实例化使用:
new Trainer(5)
new Trainer(5, Some(4.0))