scala - 有没有办法重置类中的变量并让函数设置它的值?
问题描述
所以基本上我正在尝试制作一个没有控制流的计算器。我有一个计算器类,它具有将在控制器中调用的功能(它具有与 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
}
解决方案
这里有两个主要问题。
首先,您的事件处理函数不会更改displayValue
. 如果您遵循事件处理程序的逻辑,您将看到reset
设置displayValue
为0.0
并setUp
复制displayValue
到RHS
. RHS
总是如此0.0
,计算只返回displayValue
复制到的原始值LHS
。
其次,您displayValue
用于存储用户输入和结果。因此,当用户输入另一个数字时,您的代码假定这displayValue
是用户输入,并且只是将数字附加到数字而不是开始一个新数字。
为了避免第一个问题,最好将计算器状态存储在不可变结构中,并编写基于旧状态生成新状态的方法。这将使逻辑更容易遵循。具有可变数据结构和方法,例如reset
andsetUp
使得逻辑难以遵循,并且是一种相当非 Scala 的做事方式。
要解决第二个问题,您需要分别跟踪输入和输出,或者跟踪计算器的状态以了解显示是输入还是输出。
推荐阅读
- python - 两个列表和声明
- c# - .net mvc 国际化使用资源文件仅返回英语
- c# - 在实体框架核心中没有将实体映射到表的方法
- arrays - 如何将 32 个 std_logic_vetor 字写入 VHDL 中的数组
- spring-boot - Proguard spring boot jar 项目不起作用后
- shopify - 单击结帐按钮将客户重定向到应用代理 URL
- javascript - js dtree 无法读取 null 的属性“样式”
- javascript - 使用护照使用 NodeJs mongodb(mongoose) express 的注册表单
- android - how to make the number stay in the latest number instead of going back to the default?
- swift - 初始化前使用的 SWIFT 变量