我正在尝试基于 Robert Nystrom 的书,但在 Crystal 中实现著名的 Lox 语言。现在我偶然发现了以下缺陷/错误:
我有一个枚举OpCodes,类型为UInt8:
enum OpCode : UInt8
OP_RETURN = 1
end
Run Code Online (Sandbox Code Playgroud)
和一个 的UInt8数组
@code = Pointer(UInt8).malloc( 8 )
Run Code Online (Sandbox Code Playgroud)
但现在当我想分配时code[0] = OP_RETURN,即使进行所有可能的类型转换,我仍然收到以下错误消息:
Error: can't cast OpCode to UInt8
Run Code Online (Sandbox Code Playgroud)
但我认为 OpCode 是 UInt8 所声明的。
有任何想法吗?非常感谢。我刚刚开始学习 Crystal,但到目前为止,我对这种语言印象深刻,但也有一些需要帮助的地方。
Crystal 的枚举提供了一种类型安全的方法来定义相关魔法值的列表。它们并不意味着可以与其潜在价值互换。
您的选择是直接将数组基于类型,如果确实需要,则根据数组中的值进行转换。或者在分配给数组时将枚举转换为基础值。无论哪种情况,您只需调用#value枚举值实例即可完成此操作OpCode::OP_RETURN.value。但我建议尝试保持高水平并尽可能长时间地直接使用枚举实例值。请放心,这样做不会造成性能损失。
在语言参考中了解有关枚举的更多信息:https://crystal-lang.org/reference/1.4/syntax_and_semantics/enum.html
顺便说一句,我只能强烈建议您不要滥用Pointer“数组”,如果您确实需要进入较低级别或需要值语义,请使用专用Array类。所有这些都提供了您需要向需要它的第三方库提供的用例。SliceStaticArray#to_unsafePointer
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |