首页 > 解决方案 > 有没有办法重置类中的变量并让函数设置它的值?

问题描述

所以基本上我正在尝试制作一个没有控制流的计算器。我有一个计算器类,它具有将在控制器中调用的功能(它具有与 GUI 中的按钮单击相对应的所有操作类,例如加法、等于等)。我在计算器类中有三个变量:displayvalue、LHS 和 RHS。displayvalue 是用户按下按钮输入的任何内容(一个函数进行数学运算并将点击“1”、“2”、“3”设为数字 123 并将其设置为 displayvalue)。我希望 LHS 在添加操作时将显示值重置为 0.0 之前成为显示值。重置后,我希望 RHS 成为用户按钮单击的新输入。有没有办法做到这一点?这是我迄今为止尝试过的(但它没有

class AdditionAction(calculator: Calculator) extends EventHandler[ActionEvent] {
  override def handle(event: ActionEvent): Unit = {
    calculator.LHS = calculator.displayValue //store current displayvalue
    calculator.reset() //reset displayvalue
    calculator.setUp("AdditionAction") //try to get the new displayvalue
    calculator.displayValue = calculator.LHS + calculator.RHS //perform addition
  }
}

从计算器类:

var displayValue = 0.0
var LHS: Double = displayValue
var RHS = 0.0

def setUp(input: String): Unit = {
    this.RHS = this.displayValue
    this.operation = input
  }

  def reset(): Unit ={
    this.displayValue = 0.0
  }

  def displayNumber(): Double = {
    displayValue
  }

标签: scalaclassobjectmodel-view-controller

解决方案


这里有两个主要问题。

首先,您的事件处理函数不会更改displayValue. 如果您遵循事件处理程序的逻辑,您将看到reset设置displayValue0.0setUp复制displayValueRHS. RHS总是如此0.0,计算只返回displayValue复制到的原始值LHS

其次,您displayValue用于存储用户输入和结果。因此,当用户输入另一个数字时,您的代码假定这displayValue是用户输入,并且只是将数字附加到数字而不是开始一个新数字。

为了避免第一个问题,最好将计算器状态存储在不可变结构中,并编写基于旧状态生成新状态的方法。这将使逻辑更容易遵循。具有可变数据结构和方法,例如resetandsetUp使得逻辑难以遵循,并且是一种相当非 Scala 的做事方式。

要解决第二个问题,您需要分别跟踪输入和输出,或者跟踪计算器的状态以了解显示是输入还是输出。


推荐阅读