因此,基本上,我正在尝试制作一个没有控制流程的计算器。我有一个计算器类,该类具有将在Controller中调用的功能(它具有所有操作类,例如加法,等于等,与从GUI单击按钮相对应)。在计算器类中,我有三个变量:displayvalue,LHS和RHS。 displayvalue是用户按下按钮时输入的值(一个函数进行数学运算,并将点击次数“ 1”,“ 2”,“ 3”设为数字123并将其设置为displayvalue)。我希望在添加操作将LHS重置为0.0之前,先将LHS设为displayvalue。重置后,我希望RHS是用户按钮单击时的新输入。有没有办法做到这一点?这是我到目前为止所尝试的(但是它不响应加法动作,并且不断增加输入(例如:我单击“ 1”,“ 2”,“ +”和“ 3”,我得到123,好像我从来没有点击“ +”)
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
}
答案 0 :(得分:0)
这里有两个主要问题。
首先,您的事件处理函数不会更改displayValue
的值。
如果遵循事件处理程序的逻辑,则会看到reset
将displayValue
设置为0.0
,而setUp
将displayValue
复制到RHS
。因此,RHS
始终是0.0
,计算仅返回复制到displayValue
的{{1}}的原始值。
第二,您正在使用LHS
来存储用户输入和结果。因此,当用户输入另一个数字时,您的代码将假定displayValue
是用户输入的内容,而只是将数字附加到数字上,而不是开始一个新的数字。
为避免第一个问题,最好将计算器状态存储在不可变的结构中,并编写基于旧状态生成新状态的方法。这将使逻辑更容易遵循。使用displayValue
和reset
之类的方法具有可变数据结构使逻辑难以遵循,并且是一种非标量的处理方式。
要解决第二个问题,您需要分别跟踪输入和输出,或者跟踪计算器的状态以了解显示是输入还是输出。