如何在编译时检查ByteArray的长度

  • 本文关键字:ByteArray 编译 toit
  • 更新时间 :
  • 英文 :


我想检查一些常量ByteArrays的长度,这是一个类的一部分。如果ByteArrays的长度太大-我希望在编译时检查失败。如果这是不可能的,那么我想以某种方式告诉我的驱动程序的用户。我该怎么做呢?

Toit没有办法指定ByteArray的大小作为其类型的一部分。因此,无法静态地验证用户是否提供了大小正确的数组。

通常,您将在运行时动态检查大小,如果对象不满足文档中声明(或暗示)的要求,则抛出。例如,下面是核心库的一个典型函数:

operator [..] --from=0 --to=size -> List:
if not 0 <= from <= to <= size: throw "BAD ARGUMENTS"
return ListSlice_ this from to

检查fromto与检查字节数组的大小并不完全相同,但也没有那么远。

ByteArrays需要特定的尺寸时,它们通常也代表一定的结构。在这种情况下,您可以创建一个具有相应字段的类(然后自己将其复制到字节数组中),也可以编写一个分配(或接受)正确大小的字节数组的包装器类。如果它接受一个数组,那么你仍然需要做动态检查,但这将发生得更早一些。例如:

class BytePoint:
_bytes /ByteArray  // Must be of size 2.
// Allocates a fresh byte array.
constructor: _bytes = ByteArray 2
// Takes an array as argument and uses that one instead.
constructor ._bytes: if _bytes.size != 2: throw "BAD ARGUMENTS"
x -> int: return _bytes[0]
x= new_x/int: _bytes[0] = new_x
y -> int: return _bytes[1]
y= new_y/int: _bytes[1] = new_y

最新更新