【问题标题】:Basic Calculator: How to script a function for deleting digits one by one? (GDScript)基本计算器:如何编写用于逐位删除数字的函数? (GDScript)
【发布时间】:2021-12-10 21:28:03
【问题描述】:

我已经环顾了几个小时,但仍然找不到有用的答案,所以我决定在这里问 - 我应该如何编写一个按钮来逐个删除基本计算器中的数字?

这是我的脚本!: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

我想知道如何才能使整个事情更优化/更短,但也许这完全是一个不同的问题,

【问题讨论】:

    标签: button godot script gdscript


    【解决方案1】:

    解释错误

    我将从错误开始。它说

    基础“Nil”中不存在函数“length”

    错误告诉您,您正在尝试在 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++ 中执行 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)
    

    好的,我们在节点$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)
    

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

    【讨论】:

    • 这是我需要的一个很好的解释!向你致敬:)
    猜你喜欢
    • 2017-09-19
    • 2017-09-19
    • 1970-01-01
    • 2020-05-29
    • 2017-09-03
    • 2014-01-17
    • 2015-07-03
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多