You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Crystal中无法获取二维数组元素地址的问题咨询

关于Crystal中无法取二维数组元素地址的问题分析

错误原因

编译器报错 can't take address of @map[x][y] 的核心逻辑是:

  • pointerof 仅支持获取左值的内存地址,比如实例变量、局部变量、类变量或结构体字段——这些都是直接绑定到固定内存位置的可赋值目标。
  • @map[x][y] 是一个复合表达式:它先通过 @map[x] 获取内层数组,再调用该数组的 [] 方法返回对应位置的 Room 引用。这个返回的引用是临时值,并非直接对应内存中固定位置的左值,因此不符合 pointerof 的使用要求。

解决方案

要获取二维数组中元素的指针,可利用 Crystal 数组的 to_unsafe 方法直接获取底层内存指针,再通过索引计算偏移:

def map_ptr(x : Int32, y : Int32) : Pointer(Room)
  # 获取内层数组的底层指针,并转换为 Room 类型的指针
  inner_ptr = @map[x].to_unsafe.as(Pointer(Room))
  # 偏移 y 个元素的位置,得到目标 Room 的指针
  inner_ptr + y
end

补充说明

你参考的规范中,pointerof(@foo) 合法是因为实例变量是对象内存中固定的存储位置,属于左值,直接对应内存地址。而数组索引操作是方法调用的结果,返回的是临时值,无法被 pointerof 直接处理。

内容的提问来源于stack exchange,提问作者siery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:55:16