record自定义类型

比如:

type Address = {
    province: string,
    city: string
}

type Person = {
    name: string,
    age: int default 24,
    age2: int = 24,  -- record属性默认值既可以用default也可以用=区分
    address: Address,
    parent_names: Array<string>
}

比如:

type Person = {
    name: string,
    age: int default 24
}

type Address = {
    province: string,
    city: string
}

var p1: Person = {name='uvm'} -- 用Map<T>值给record类型的变量赋值,会做自动类型转换
var p2: Address = p1           -- 编译报错,p1是Person类型变量,不能赋值给Address类型的变量
var p3: table = p1             -- 正确,record类型的变量或值可以赋值给table类型的变量

合约的storage的初始化是直接由区块链初始化的,record类型的default属性值不对它起作用

比如:

type Person = {
    name: string,
    age: int default 24,
    age2: int = 24  -- record属性默认值既可以用default也可以用=区分
}
let p1 = Person()                        -- p1值是{name: nil, age: 24, age2: 24}
let p2 = Person({name='uvm'})           -- p2值是{name: 'uvm', age: 24, age2: 24}
let p3 = Person({name='uvm', age=100})  -- p3值是{name: 'uvm', age: 100, age2: 24}
let p4: Person = {}                      -- p4值是{}

比如:

type Person<A> = {  -- A就是Person泛型的泛型参数,是用来代表未知类型的类型变量
    name: string,
    address: A      -- 将address属性声明为A类型,则表示address属性的类型根据Person泛型实例化时的A的具体类型来确定
}
let p = Person<string>()  -- 这里先用string类型替换Person泛型的A类型变量替换产生一个新类型Person<string>,然后调用这个新类型的构造函数

比如:

type Person = {
    name: string,
    age: int
}
var p1 = {}
function p1.sayHi1(self)    -- 正确
end
function p1:sayHi2()    -- 正确
end

var p2 = Person()
function p2.sayHi1(self)    -- 编译错误,p2是record类型的,不能用varname.funcName的方式定义成员函数
end
function p2:sayHi2()        -- 正确
end

p1:sayHi1()                 -- 正确
p1:sayHi2()                 -- 正确
p2:sayHi2()                 -- 正确