基本计算器:如何编写一个函数来逐个删除数字? (GD脚本)
Basic Calculator: How to script a function for deleting digits one by one? (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
我想知道如何让整个事情变得更加 optimized/shorter 但也许那完全是为了另一个问题,
解释错误
我将从错误开始。它说
Nonexistent function 'length' in base 'Nil'
错误告诉您您正尝试在 Nil
上调用一个名为 length
的函数,但 Nil
没有一个名为 length
的函数.
问题是您正试图在 Nil
上调用某些东西。你想打电话给什么? length
。那么那是哪里?那是在这里:
numberAdded = numberAdded.length() - 1
所以,numberAdded
就是 Nil
。下一个问题是为什么。那么,让我们看看 numberAdded
的价值在哪里……
所以你在这里声明:
var numberAdded
然后我们有这一行与它无关:
var numberBefore = $NumberStuffs.get_text()
然后是错误的行:
numberAdded = numberAdded.length() - 1
如果 numberAdded
没有值,您期望 numberAdded.length()
是什么?当然这是一个错误。
顺便说一句,代码表明您希望 numberAdded
是一个数字。这让我想知道您对此有何期望:
numberAdded[numberBefore]=("")
是的,您可以在 C 或 C++ 中执行 the inverted indexing thing,因为它只是添加指针。但不是 GDScript,你不知道。
我怀疑使用类型会对您有所帮助。例如,将 numberAdded
声明为这样的整数:var numberAdded:int
。 是的,GDScript has types,使用它们。
如何删除最后一个字符
让我参考一下你如何添加数字:
func _on_Button1_pressed():
var currentNumber = $NumberStuffs.get_text()
currentNumber = currentNumber + "1"
$NumberStuffs.set_text(currentNumber)
好的,我们在节点 $NumberStuffs
的 text
属性 上存储一个字符串。然后我们通过连接来添加一个数字。
上面的代码应该等同于:
func _on_Button1_pressed():
$NumberStuffs.text += "1"
如果 get_text
和 set_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
(which lets you get a portion of the string from the left, there is also a 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)
顺便说一句,我在声明变量时一直使用:=
。这声明了我用来初始化它们的任何类型的变量。
我已经环顾四周几个小时了,但仍然找不到有用的答案,所以我决定在这里问 - 我应该如何编写一个按钮来逐一删除基本计算器中的数字?
到目前为止,这是我的脚本!: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
我想知道如何让整个事情变得更加 optimized/shorter 但也许那完全是为了另一个问题,
解释错误
我将从错误开始。它说
Nonexistent function 'length' in base 'Nil'
错误告诉您您正尝试在 Nil
上调用一个名为 length
的函数,但 Nil
没有一个名为 length
的函数.
问题是您正试图在 Nil
上调用某些东西。你想打电话给什么? length
。那么那是哪里?那是在这里:
numberAdded = numberAdded.length() - 1
所以,numberAdded
就是 Nil
。下一个问题是为什么。那么,让我们看看 numberAdded
的价值在哪里……
所以你在这里声明:
var numberAdded
然后我们有这一行与它无关:
var numberBefore = $NumberStuffs.get_text()
然后是错误的行:
numberAdded = numberAdded.length() - 1
如果 numberAdded
没有值,您期望 numberAdded.length()
是什么?当然这是一个错误。
顺便说一句,代码表明您希望 numberAdded
是一个数字。这让我想知道您对此有何期望:
numberAdded[numberBefore]=("")
是的,您可以在 C 或 C++ 中执行 the inverted indexing thing,因为它只是添加指针。但不是 GDScript,你不知道。
我怀疑使用类型会对您有所帮助。例如,将 numberAdded
声明为这样的整数:var numberAdded:int
。 是的,GDScript has types,使用它们。
如何删除最后一个字符
让我参考一下你如何添加数字:
func _on_Button1_pressed():
var currentNumber = $NumberStuffs.get_text()
currentNumber = currentNumber + "1"
$NumberStuffs.set_text(currentNumber)
好的,我们在节点 $NumberStuffs
的 text
属性 上存储一个字符串。然后我们通过连接来添加一个数字。
上面的代码应该等同于:
func _on_Button1_pressed():
$NumberStuffs.text += "1"
如果 get_text
和 set_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
(which lets you get a portion of the string from the left, there is also a 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)
顺便说一句,我在声明变量时一直使用:=
。这声明了我用来初始化它们的任何类型的变量。