基本计算器:如何编写一个逐个删除数字的函数脚本?(GDScript)



我应该如何编写一个按钮来逐个删除基本计算器中的数字?

这是我到目前为止的脚本:https://pastebin.com/xLj2iCHU

func _on_BDeleteDigit_pressed():
var numberAdded
var numberBefore = $NumberStuffs.get_text()
numberAdded = numberAdded.length() - 1
numberAdded[numberBefore]=("")
$Outputlabel.set_text(str(numberAdded))

这也是按下删除按钮时的错误: https://i.stack.imgur.com/8OJTI.png

解释错误

我将从错误开始。它说

基数"无"中不存在函数"长度">

该错误告诉您您正在尝试在Nil的东西上调用名为length的函数,但Nil没有名为length的函数。

问题是您正在尝试在Nil上调用某些内容。你想叫什么?length.那么这是哪里呢?那就是这里:

numberAdded = numberAdded.length() - 1

所以,numberAddedNil.下一个问题是为什么。那么,让我们看看numberAdded的价值从何而来......

所以你在这里声明它:

var numberAdded

然后我们有与它无关的这一行:

var numberBefore = $NumberStuffs.get_text()

然后是带有错误的行:

numberAdded = numberAdded.length() - 1

如果numberAdded没有价值,您期望numberAdded.length()是什么?当然,这是一个错误。


顺便说一下,代码表明您希望numberAdded是一个数字。这让我想知道你对此有什么期望:

numberAdded[numberBefore]=("")

是的,您可以在 C 或 C++ 中执行倒排索引操作,因为它只是添加指针。但不是GDScript,你没有。


我怀疑使用类型会对您有所帮助。例如,将numberAdded声明为如下所示的整数:var numberAdded:int是的,GDScript 有类型,请使用它们。


如何删除最后一个字符

让我参考一下您如何添加数字:

func _on_Button1_pressed():
var currentNumber = $NumberStuffs.get_text()

currentNumber = currentNumber + "1"
$NumberStuffs.set_text(currentNumber)

好的,我们将字符串存储在节点$NumberStuffstext属性上。我们通过连接来添加一个数字。

上面的代码应该等效于这个:

func _on_Button1_pressed():
$NumberStuffs.text += "1"

如果get_textset_text是 GDScript 中的自定义函数,您可能需要查看setget


因此,问题是如何删除字符串的最后一个字符。有几种方法!

一种方法是使用erase

func _on_BDeleteDigit_pressed():
var text := $NumberStuffs.text
var length := text.length()
text.erase(length - 1, 1)
$NumberStuffs.text = text

请注意,erase正在修改字符串,但字符串是我们从读取$NumberStuffs.text(或调用$NumberStuffs.get_text)中获得的副本,这就是为什么我们需要设置为$NumberStuffs.text(或调用$NumberStuffs.set_text)的原因。

或者,如果您愿意:

func _on_BDeleteDigit_pressed():
var text := $NumberStuffs.get_text()
var length := text.length()
text.erase(length - 1, 1)
$NumberStuffs.set_text(text)

或者,我们可能会得到一个字符串,它类似于我们拥有的字符串,只是缺少最后一个字符。我们可以用left做到这一点(它让你从左边获取字符串的一部分,还有一个right函数可以做同样的事情,但从右边):

func _on_BDeleteDigit_pressed():
var length := $NumberStuffs.text.length()
$NumberStuffs.text = $NumberStuffs.text.left(length - 1)

或者,如果您愿意:

func _on_BDeleteDigit_pressed():
var text := $NumberStuffs.get_text()
var length := text.length()
$NumberStuffs.set_text(text.left(length - 1))

通常,我们可以得到一个字符串,其中包含另一个字符串的一部分,substr

func _on_BDeleteDigit_pressed():
var length := $NumberStuffs.text.length()
$NumberStuffs.text = $NumberStuffs.text.substr(0, length - 1)

或者,如果您愿意:

func _on_BDeleteDigit_pressed():
var text := $NumberStuffs.get_text()
var length := text.length()
$NumberStuffs.set_text(text.substr(0, length - 1))

是的,您可以通过索引来修改字符串,我相信这就是您正在尝试的。例如:

$NumberStuffs.text[-1] = "a"

相当于:

var length := $NumberStuffs.text.length()
$NumberStuffs.text[length - 1] = "a"

相当于:

var text := $NumberStuffs.get_text()
var length := text.length()
text[length - 1] = "a"
$NumberStuffs.set_text(text)

将最后一个字符替换为"a"。是的,您可以通过这样做来删除。那将是:

$NumberStuffs.text[-1] = ""

相当于:

var length := $NumberStuffs.text.length()
$NumberStuffs.text[length - 1] = ""

相当于:

var text := $NumberStuffs.get_text()
var length := text.length()
text[length - 1] = ""
$NumberStuffs.set_text(text)

顺便说一下,我在声明变量时一直在使用:=。这声明了我用来初始化它们的任何类型的变量。

最新更新