Ruby和指针

Joe*_*ann 3 ruby pointers

我正在为一个小型游戏编写一个Dungeon Generator.

地下城是由房间组成的.A roomconnections其他房间.

room.connections = [room_a, room_b]

room.number = 1 # unique id

现在我需要按它的号码选择一个房间.

我首先用一个recursive_scan方法做了这个,因为房间可以导入圆圈而导致StackOverflowError无效.所以我把一个already_scanned带有房间号码的数组放进去,这个数字已被选入方法的算法中.然后它没有扫描所有的房间 - 顺便说一句,我不知道为什么,根据我的逻辑不合理它应该有效.

然后我试图将所有房间也放在一个阵列中,然后迭代阵列为想要的房间 - 但在这里我得到了问题,每个房间基本上连接到其他每个房间,至少与其他房间相连; 所以阵列变得如此大dungeon_size * array_of_rooms.length.

我现在需要的是一个显式指针 - 我知道几乎每个ruby中的var都是一个指针,除了Fixnums和Float(还有其他一些).尽管如此,数组变得很大,所以我需要一个真正的指针.

(我也尝试设置一个object_ids数组并通过ObectSpace加载它们,但遗憾的是 - 因为我经常需要加载房间 - 那些带有想要的object_id的房间已经被回收了,正如错误信息所解释的那样.)

这是我的递归扫描方法:

def room(number)
  recursive_scan(@map, number, []) # @map is the entrance room
end

private

def recursive_scan(room, number, scanned)
  scanned << room.room_number
  if room.room_number == number
    room
  else
    r = nil
    room.connections.each do |next_room|
      if !scanned.include?(next_room.room_number)
        r = recursive_scan(next_room, number, scanned)
      end
    end
    r
  end
end
Run Code Online (Sandbox Code Playgroud)

Dig*_*oss 6

Ruby中的所有内容都已经成为参考.

为什么不保持房间指数?

rooms[room.number] = room
Run Code Online (Sandbox Code Playgroud)

然后你可以得到任何东西rooms[i].我只需修改Room 的初始化方法,就可以使索引保持最新状态.

def initialize
  rooms[self.number] = self
  . . .
end
Run Code Online (Sandbox Code Playgroud)

这不会占用太多空间,因为数组只是一个索引,它实际上没有房间的副本.从数组中获取的每个引用与通过程序中的任何其他机制获得的引用基本相同,并且引用和经典指针之间唯一真正的区别是垃圾收集的一些开销.

如果房间被删除(除了退出之前),您将需要设置rooms[x] = nil删除时间.

我不明白为什么你需要先创建数据结构,然后索引房间,但是你应该能够做到递归枚举,并使用房间索引数组中的房间存在作为be-here标志.我不确定为什么它之前没有用,但如果仔细写的话,它真的必须这样做.