【问题标题】:scala: optional default argument as function of other argumentsscala:作为其他参数的函数的可选默认参数
【发布时间】: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)) {}

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

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

【问题讨论】:

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

标签: scala constructor default-value


【解决方案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))
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2018-12-03
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多