💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
匿名结构可以用来组织数据,而不用显式的创建一个类型。下面的示例创建了一个结构,包含两个字段 `x` 和 `name`,并分别初始化它们的值为 `12` 和 “`foo`”: ~~~ class Main { static public function main() { var myStructure = { x: 12, name: "foo"}; } } ~~~ 一般语法规则如下: * 一个包括在花括号 `{}` 内的结构 * 一个使用逗号 `,` 分隔的键值对列表 * 冒号 `:` 用来分隔的键和值,键名必须是一个有效的 [标识符(第5章)](http://#) * 值可以是任何 Haxe 表达式 规则 4 意味着结构可以被嵌套和混合,如: ~~~ var user = { name : "Nicolas", age : 32, pos : [ { x : 0, y : 0 }, { x : 1, y : -1 } ], }; ~~~ 匿名结构的字段就像类的,可以使用点号操作符 `.` 访问,如下: ~~~ // 获取键 name 的值,即 "Nicolas" user.name; // 设置 键 age 的值为 33 user.age = 33; ~~~ 值得注意的是,使用匿名结构不会破坏类型系统。编译器确保只能访问可用的字段,也就是说,如下的程序不会编译: ~~~ class Test { static public function main() { var point = { x: 0.0, y: 12.0 }; // { y : Float, x : Float } 没有字段 z point.z; } } ~~~ 错误信息表明编译器了解 `point` 的类型:它是一个包括Float类型的 `x` 和 `y` 字段的匿名结构。由于它没有字段 `z`,访问失败。 `point` 的类型被通过 [类型推断(第3.6节)](http://#) 得知,这把我们从要为局部变量使用显式类型声明中解救出来。然而,如果 `point` 是一个字段,还是必须显式的声明类型: ~~~ class Path { var start : { x : Int, y : Int }; var target : { x : Int, y : Int }; var current : { x : Int, y : Int }; } ~~~ 为了避免这种冗余的类型声明,尤其是对于更复杂的结构,建议使用一个 [typedef(第3.1节)](http://#): ~~~ typedef Point = { x : Int, y : Int } class Path { var start : Point; var target : Point; var current : Point; } ~~~