Dictionary Haxe映射仅检索'null'`
我在Haxe中使用地图时遇到问题。我正在尝试创建一个平铺对象的网格,并使用网格上的索引作为键将它们添加到地图中。但是,当我尝试使用索引从地图检索分幅时,我总是得到Dictionary Haxe映射仅检索'null'`,dictionary,multidimensional-array,haxe,Dictionary,Multidimensional Array,Haxe,我在Haxe中使用地图时遇到问题。我正在尝试创建一个平铺对象的网格,并使用网格上的索引作为键将它们添加到地图中。但是,当我尝试使用索引从地图检索分幅时,我总是得到null的值 有人能解释为什么会这样吗?我以前从未使用过地图,我不明白问题出在哪里。我目前正在使用多维数组来获得相同的功能,但映射似乎更方便 private function initTiles():Void { var tempTile:Tile; tileMap = new Map(); for (i in
null
的值
有人能解释为什么会这样吗?我以前从未使用过地图,我不明白问题出在哪里。我目前正在使用多维数组来获得相同的功能,但映射似乎更方便
private function initTiles():Void
{
var tempTile:Tile;
tileMap = new Map();
for (i in 0...widthTiles)
{
for (j in 0...heightTiles)
{
tempTile = new Tile(i * 32, j * 32);
tileMap.set([i,j],tempTile);
}
}
}
问题在于,实际上您并不是在创建多维数组,而是在创建一个一维数组,其中键类型为
数组
。如果有疑问,您可以使用$type(tileMap)
让编译器告诉您它认为您拥有的类型
在您的情况下,您将获得:
Map<Array<Int>,Tile>; // This is an ObjectMap, where the object is an Array
基本上,在Haxe中,对象(包括数组)的相等性取决于它们是否是完全相同的对象,而不是它们是否具有相同的值。在本例中,您将比较两个不同的阵列。尽管它们具有相同的值,但它们实际上是两个不同的对象,并且不相等。因此,他们不会为您的地图制作合适的键
以下是您需要做的工作示例:
class Test {
static function main() {
initTiles();
trace( tileMap[3][6] );
}
static var tileMap:Map<Int,Map<Int,Tile>>;
static function initTiles():Void {
var widthTiles = 10;
var heightTiles = 10;
tileMap = new Map();
for (i in 0...widthTiles) {
if ( tileMap[i]==null ) {
// Add the sub-map for this column
tileMap[i] = new Map();
}
for (j in 0...heightTiles) {
// Add the tile for this column & row
tileMap[i][j] = new Tile(i*32, j*32);
}
}
}
}
class Tile {
var x:Int;
var y:Int;
public function new(x:Int, y:Int) {
this.x = x;
this.y = y;
}
}
类测试{
静态函数main(){
initTiles();
微量元素(tileMap[3][6]);
}
静态变量tileMap:Map;
静态函数initTiles():Void{
var=10;
var heightTiles=10;
tileMap=新映射();
用于(0…宽度瓷砖中的i){
if(tileMap[i]==null){
//添加此列的子映射
tileMap[i]=新映射();
}
适用于(0英寸j…高度){
//添加此列和行的平铺(&W)
tileMap[i][j]=新瓷砖(i*32,j*32);
}
}
}
}
类瓷砖{
var x:Int;
变量y:Int;
新公共函数(x:Int,y:Int){
这个.x=x;
这个。y=y;
}
}
要查看它的运行:(打开浏览器控制台查看跟踪)。可能重复的
trace( [0,0] == [0,0] ); // False!
class Test {
static function main() {
initTiles();
trace( tileMap[3][6] );
}
static var tileMap:Map<Int,Map<Int,Tile>>;
static function initTiles():Void {
var widthTiles = 10;
var heightTiles = 10;
tileMap = new Map();
for (i in 0...widthTiles) {
if ( tileMap[i]==null ) {
// Add the sub-map for this column
tileMap[i] = new Map();
}
for (j in 0...heightTiles) {
// Add the tile for this column & row
tileMap[i][j] = new Tile(i*32, j*32);
}
}
}
}
class Tile {
var x:Int;
var y:Int;
public function new(x:Int, y:Int) {
this.x = x;
this.y = y;
}
}