You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot中返回Dictionary的自定义函数为何返回Nil?

问题分析与修复方案

你遇到的问题是getItem函数看似每个分支都有返回值,但实际调用后返回Nil,导致后续调用get方法触发Invalid call. Nonexistent function 'get' in base 'Nil'错误。以下是具体的排查方向和修复建议:

可能的问题根源

1. is_name_in_inventory逻辑错误

如果这个函数错误返回true,但inventory.item1到item4中没有匹配itemName的项,会进入第一个if块但所有elif都不命中,理论上会走到Unknown error分支返回字典,但如果函数在这之前因为其他错误提前终止(比如访问Nil对象的属性),就会返回Nil。

2. inventory.itemX为Nil或非字典类型

  • 若inventory.item1是Nil,访问inventory.item1.name会直接触发运行时错误,导致函数无返回值退出(即返回Nil)。
  • 若inventory.itemX不是Dictionary类型,调用merge方法会失败,可能返回Nil(只有原生Dictionary才有merge方法,自定义类需自行实现并确保返回字典)。

3. merge方法返回Nil

如果inventory.itemX.merge()的实现存在问题,没有正确返回合并后的字典,那对应的return语句就会返回Nil。

修复步骤

  1. 添加Nil检查,避免属性访问错误
    修改函数,在访问itemX.name前先确认对象不为Nil:

    func getItem(itemName:String) -> Dictionary:
        if is_name_in_inventory(itemName):
            if inventory.item1 != null and inventory.item1.name == itemName:
                return inventory.item1.merge({"index": 1, "error": false})
            elif inventory.item2 != null and inventory.item2.name == itemName:
                return inventory.item2.merge({"index": 2, "error": false})
            elif inventory.item3 != null and inventory.item3.name == itemName:
                return inventory.item3.merge({"index": 3, "error": false})
            elif inventory.item4 != null and inventory.item4.name == itemName:
                return inventory.item4.merge({"index": 4, "error": false})
    
            print("Unknown error finding an inventory item...")
            return {"error": true, "errormessage": "Item not found in inventory slots"}
        
        print("That name does not exist!")
        return {"error": true, "errormessage": "That name does not exist!"}
    
  2. 验证is_name_in_inventory的逻辑一致性
    确保该函数的判断规则和后续itemX.name的匹配规则完全一致(比如是否区分大小写、是否处理空格或特殊字符),避免出现“函数认为存在,但实际找不到对应项”的情况。

  3. 检查merge方法的有效性

    • 如果inventory.itemX是原生Dictionary,可以单独测试merge的返回值:
      var test_merge = inventory.item1.merge({"index":1, "error":false})
      print("Merge result: ", test_merge)
      
    • 如果是自定义类,确认merge方法正确实现,且返回的是Dictionary类型而非Nil。
  4. 调用时增加Nil防护
    暂时在调用处增加判断,避免直接在Nil上调用方法:

    var item_data = getItem("item")
    var error_status = item_data != null ? item_data.get("error", false) : true
    

内容的提问来源于stack exchange,提问作者funfoxrr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:45:32