Zentutorial
  • 首页
  • Zenscript
  • 简单运用
    • 局部变量
    • 尖括号调用
    • 工作台合成
      • 添加配方
      • 移除配方
      • Metadata
      • NBT
    • 熔炉配方
    • 矿物词典(Ore Dictionaries)
    • 物品名称修改
    • tooltips
      • 样式代码
    • 物品条件
    • 物品转换器
    • 掉落物
      • 打草掉落物
      • 生物掉落物
      • Dropt - 导言
        • Dropt - 方法速查
        • Dropt - 使用示例
    • 战利品表 : 导论
      • 战利品表修改(LootTableTweaker)
      • 战利品表修改(LootTweaker-基础)
    • 循环语句(foreach循环) / 普通数组
  • 高级运用
    • 概论
      • 基本类
      • ZenGetter
      • ZenSetter
      • ZenMethod(方法)
    • 常见错误
    • 基本运算
    • 数组与集合
    • 循环与遍历
    • 全局函数
    • Math包
    • if
    • in/has 操作符
    • 战利品表修改(LootTweaker-进阶)
    • 三元操作符
    • 预处理器
    • 全局和静态变量
    • 跨脚本引用
    • 关联数组(映射)
    • IItemStack类型的重新认识
    • IIngredient接口
    • IItemDefinition & IBlockDefinition
    • IData 类型
      • DataMap
    • 穷举与遍历
    • 自定义函数
    • 配方函数与配方事件
      • 配方函数
      • 配方事件
    • 事件概论
      • 一些忠告
    • ZenClass
  • ContentTweaker
    • ContentTweaker
    • 指令
    • 原版加工厂
      • 概论
      • 物品
      • 方块
      • 流体
      • 创造标签
      • 食物
    • 材料系统
      • 基础用法
        • 材料
        • 部件
        • 注册材料部件
        • 材料部件信息
      • 高级运用
        • 自定义部件类型
        • 注册自定义部件
        • 自定义材料部件信息
    • 高级运用
    • 更多鸡联动
    • 匠魂联动
      • 材料引导
        • 材料
        • 构建材料
      • 特性引导
        • 特性
        • 构建特性
        • 特性数据
      • 高级运用
  • 实战
    • 配方
      • 数据驱动合成修改
    • 事件
      • 修改方块掉落物
      • 禁止开创造
由 GitBook 提供支持
在本页
  • 声明
  • 修改
  • in/has 操作符

这有帮助吗?

  1. 高级运用
  2. IData 类型

DataMap

IData具有很多子类,但在其中,最重要的是DataMap,因为你获取到的物品、方块、玩家的NBT都是IData中的DataMap。Map即为映射,与上文的映射数组有些类似,不同的是,值可以是不同的类(其实值都是IData),而key只能为字符串。

声明

声明一个DataMap的方法与IData其他子类的声明不同。

import crafttweaker.data.IData;

val myFirstMap as IData = {key1: "value1",
                  key2: "value2",
                  key3: 3};

你甚至可以嵌套,NBT大多也是这样

val nestedMap as IData = { key1: 
                    {
                        key1: "hello"
                    }
                };

修改

然而 DataMap 的元素不能直接修改,你也可以用 key 检索其中的元素,将会返回这个 key 对应的值,均以 IData 形式返回。

val mySecondMap as IData = {key1: "value1",
                   key2: "value2",
                   key3: 3};

// 检索叫做 "key1" 的成员
var k1 as IData = mySecondMap.key1;
print(k1.asString());

// 检索叫做 "key2" 的成员
var k2 as IData = mySecondMap.memberGet("key2");
print(k2.asString());

你可以用 + 来合并两个IDataMap和 - 来裁剪IDataMap。合并时,相同key的值后者会覆盖前者(这是你唯一可以「修改」值的方法,注意它们都不会真正修改原有的 DataMap,而是返回一个新的 DataMap 结果是两个 DataMap 合并/裁剪后的)。裁剪可以去除特定key的元素。

val map1 as IData = {
    key1 : "hello",
    key3 : "test",
};

val map2 as IData = {
    key2 : "bye",
    key3 : "override"
};

print((map1 + map2).asString()); // 打印出 {key1 : "hello", key2 : "bye", key3 : "override"}



val map3 as IData = {
    key1 : "two",
    key2 : "two",
    key3 : "three"
};

print((map3 - "key1").asString()); // 打印出 {key2 : "two", key3 : "three"}

val map4 as IData = {
    key3 : "anything"
};

print((map3 - map4).asString()); // 打印出 {key1 : "two", key2 : "two"}

in/has 操作符

你可以用 in/has 操作符来检测一个 DataMap 是否有指定的 key


val map3 as IData = {
    key1 : "two",
    key2 : "two",
    key3 : "three"
};

print(map3 has "key1"); // true
print(map3 has "key4"); // false
上一页IData 类型下一页穷举与遍历

最后更新于1年前

这有帮助吗?