# 内置record类型

  • Contract<S>类型,用于声明合约变量类型,S使用当前合约的storage类型替换

内置的Contract类型的代码实现如下:

type Contract<S> = {
    id: string,
    name: string,
    storage: S
}

使用例子如下:

type Storage = {
    author_name: string,
    age: int
}
let M: Contract<Storage> = {}
function M:init()
    self.storage.age = 100
    self.storage.author_name = 'uvm'
    -- 这里self.id和self.name, self.storage.author_name是字符串类型,self.storage.age 是整数
    
end
return M
  • Stream类型,用于作为字节流类型使用,是一个内置的record类型,但是Stream类型的对象访问其中的成员函数只能用冒号不能用点号的形式

内置的Stream的类型签名如下:

type Stream = {
    pos: () => int,  -- 获取字节流中当前位置
    eof: () => bool, -- 获取字节流是否到结尾
    current: () => int,  -- 获取当前字节(转成int类型),如果已经读取结束了无法读取当前字节,返回-1
    next: () => bool,    -- 如果字节流还没有到结尾,pos递进1步,返回true,否则返回false
    reset_pos: () => nil,   -- 重组字节流的当前读取位置到起始位置
    size: () => int,        -- 获取字节流的长度
    push: (int) => nil,     -- 把参数取最后一字节(转成C风格的char类型),加入字节流
    push_string: (string) => nil  -- 把参数字符串中每一个字节加入字节流
}

使用例子如下:

let a1 = Stream()
a1:push(123)    -- 对于Stream类型,不能使用a1.push(a1, 123)这种点号访问成员函数的方法
a1:push_string('abc')
let s1 = a1:size()
pprint("a1 size is ", s1)
pprint('a1 is ', tostring(a1), tojsonstring(a1))
pprint('a1 pos is', a1:pos())

var c = a1:pos()

var s = ''
while c < a1:size() do
    s = s .. tostring(a1:current())
    pprint("a1[", c, "]=", a1:current())  -- 应该依次输出 a1[0]=123   a1[1]=97    a1[2]=98      a1[3]=99
    c = c + 1
    a1:next()
end