【问题标题】:scala using a class argument a placeholder (or input variable)scala 使用类参数占位符(或输入变量)
【发布时间】:2017-01-05 01:47:11
【问题描述】:

假设我有一个包含参数化数据类型的数据结构:

case class Terminal[A](value: A, name: String ="")

如果我传递一个具体化的常量,我可以轻松地创建一个Terminal[Double]

val terminal = Terminal(2.0)

但是,我希望它也能够接收(未实现)input,以便我可以使用不同的上下文多次评估终端。我可以通过按名称调用value 来实现一个简单的解决方案,即

class Terminal[A](value: => A, name: String ="") {
  def getValue = this.value
}

var x = 1.0

val terminal = new Terminal(x)

terminal.getValue // 1.0

x = 100.0

terminal.getValue // 100.0

然而,这个程序的用户必须用类似var input_x = None的东西来初始化input,这不是很好,然后改变它的状态,这反过来又不得不让我把value变成@ 987654330@

这是处理这种情况的最佳方法吗?是不是我可以使用任何设计模式或 scala 功能?

我还可以创建一个类Input 来表示这些依赖于上下文的输入,但是我需要更改很多东西。

【问题讨论】:

  • 您似乎在尝试将特定解决方案应用于问题时遇到了麻烦。问题是,您正在寻求实施解决方案的帮助,这几乎可以肯定是错误的,但永远不要描述您要解决的实际问题。我建议你退后一步,尝试描述为什么(你认为)你需要这个 Terminal 类,以及如何想象在现实生活中使用它。

标签: scala parameter-passing lazy-loading lazy-initialization


【解决方案1】:

你可以使用如下的不可变对象:

scala> case class Terminal[A](value: A, name: String ="") {
     |   def update(newValue: A): Terminal[A] = this.copy(value = newValue)
     |   def getValue: A = this.value
     | }
defined class Terminal

scala> val terminal = Terminal(1.0)
terminal: Terminal[Double] = Terminal(1.0,)

scala> val updatedTerminal = terminal.update(100.0)
updatedTerminal: Terminal[Double] = Terminal(100.0,)

scala> val oldValue = terminal.getValue
oldValue: Double = 1.0

scala> val newValue = updatedTerminal.getValue
newValue: Double = 100.0

这里的 getValue 方法实际上是多余的,因为 getter 随 case classes 提供。我只是把它放在那里来演示这个例子。

scala> oldValue == terminal.value
res0: Boolean = true

scala> newValue == updatedTerminal.value
res1: Boolean = true

一般来说,如果您想创建不具有可变状态的对象(例如,所有单例组件都最好作为非案例类),则首选案例类。

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 2017-06-14
    • 2013-05-17
    • 1970-01-01
    • 2011-03-30
    • 2013-08-22
    • 2021-03-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多