array|译:Gamemaker Studio 2.3 语法详解( 二 )


Structs as maps
与实例类似 ,struct 有 variable_struct_* 函数用于动态管理其变量 。
这使得 struct 可以作为 ds_maps 的垃圾收集替代物:
varq ={a:1};
variable_struct_set (q,"b",2);
variable_struct_set (q,"$","dollar");
show_debug_message (q);// { $ : "dollar", a : 1, b : 2 }
show_debug_message (q.b);// 2
show_debug_message (variable_struct_get(q,"a"));// 1
show_debug_message (variable_struct_get(q,"$"));// dollar
为了方便 , 2.3.1 开始通过添加 struct[$key] 访问器进一步扩展了这一点:
varq ={a:1};
q [$"b"]=2;// 等同于 variable_struct_set(q, "b", 2)varv =q[$"b"];// 等同于 variable_struct_get(q, "b")
结合 array, 这允许复制大多数数据结构而无需明确的销毁它们 。
一些注意事项:

  • 直接 (a.b) 读/写比使用 variable_struct_* 函数更快 , 可用于您确定结构具有变量的情况 。 否则 variable_struct_* 函数的性能与 ds_map 非常相似 。
  • 与 ds_map 不同 ,ds_map 几乎可以接受任何 key 值 , 但 struct 变量名称是字符串 , 因此 variable_struct_set(q, 4, "four") 与 variable_struct_set(q, "4", "four") 相同 。
  • Structs for JSON
  • 2.3.1 增加了 json_stringify 和 json_parse 函数 , 它们与现有的 json_encode 和 json_decode 很相似 , 但使用的是 struct 和 array, 而不是像之前的和 map 和 list。
我们可以这样:
varo ={
a_number :4.5,
a_string :"hi!",
an_array :[1,2,3],
a_struct:{x:1,y:2}
};
show_debug_message(json_stringify(o));
这会输出下面的信息:
{"a_string":"hi!","an_array":[1,2,3],"a_struct":{"x":1,"y":2},"a_number":4.5}
并将该字符串传递给 json_parse 会返回给我们一个嵌套 struct。
Functions
以前 , 每个脚本资源都将包含在调用时要运行的单个代码片段 。
像下面这样:
/// array_find_index(array, value)
/// @param array
/// @param value
var_arr =argument0;
var_val =argument1;
var_len =array_length_1d(_arr);
for(var_ind =0;_ind <_len;_ind++){
if(_arr[_ind]==_val)return_ind;
}
return-1;
但现在 , 情况不同了 - 我们可以在同一个脚本资源中有多个独立的片段 , 通过使用 function { } 语法来区分:
/// @param array
/// @param value
functionarray_find_index{
var_arr =argument0;
var_val =argument1;
var_len =array_length_1d(_arr);
for(var_ind =0;_ind <_len;_ind++){
if(_arr[_ind]==_val)return_ind;
}
return-1;
}
/// @param array
/// @param value
functionarray_push{
var_arr =argument0;
var_val =argument1;
_arr[@array_length(_arr)]=_val;
}

推荐阅读