数据类型

var p: Int            //值类型
var p: own* Int       //所有权指针
var p: * Int          //非所有权指针
var p: raw* Int       //裸指针

明确的拷贝或者移动

移动或者共享所有权指针

var p: own* Int = ...
var p1 = p; //compiler error
var p2 = move p
var p3 = share(p2)

移动或者拷贝有所有权指针的结构:

struct A {
    var i: own* Int
    fun copy(): A { ... }
}
var a: A
var x = a //compile error
var b = move a
var c = a.copy()

Unsafe

在unsafe块中解引用裸指针

var p: raw* Int
...
unsafe {
    var i = *p
}

Unsafe 函数必须在unsafe块中调用

unsafe fun foo() { ... }

fun main() {
    unsafe {
        foo()
    }
}

继承

和Java一样的单继承

trait I {
    virtual fun foo()
}

virtual struct B {
    var a: Int
    fun bar() { ... }
}

struct A : B, I {
    override fun foo(B* b) {
        ...
    }
}

With块

with块不是C++的命名初始化, 它可以包含任何语句.

struct A {
    var i: Int
    fun init() { ... }
}

var a  = A { .init(); .i = 0 }
var a: own* A = new A { .i = 0 }

指针用法

总是通过.来访问

var a: A
var b: own* A
a.foo()
b.foo()

类型转换和判断

var a = p as own* A
var b = p is own* A

数组

静态大小的数组

var a  = []Int { 1,2,3 }
var a: [15]Int

泛型类型

泛型类型通过$<开头

struct Bar$<T> {
    fun foo() {
        ...
    }
}

T fun foo$<T>(a: T) {
    return a
}

var b: Bar$<Int>

Null 安全

指针默认是不可以为null的

var a: own*? B
var b: own* B = a

可空类型转为不可空类型会在运行时进行检测,防止空值传播。

不可变性

和C++类似

var p : raw* const Int
var p : const raw* Int
var p : const raw* const Int

可见性

public
private
protected
readonly

readonly 的意思是公开读,私有写。

操作符重载

struct A {
    operator fun mult(a: A): A { ... }
}

var c = a * b

可重载的操作符:

methods    symbol
------     ------
plus       a + b 
minus      a - b 
mult       a * b 
div        a / b 
get        a[b] 
set        a[b] = c
compare    == != < > <= >=
add        a,b,c;

模块

模块是命名空间,也是编译单元和部署单元。

一个模块包含好多源文件和文件夹.

模块通过构建脚本来定义:

name = hello
summary = hello
outType = exe
version = 1.0
depends = sric 1.0
srcDirs = ./

在代码里面导入外部模块:

import std::*
import std::Vec

闭包

fun foo(f: fun(a:Int) ) {
    f(1)
}

foo(fun(a:Int){ ... })

类型别名

别名:

typealias VecInt = std::Vec$<Int>

枚举

enum Color {
    red = 1, green, blue
}

var c = Color::red

默认参数和命名参数

fun foo(a: Int, b: Int = 0) {
}

fun main() {
    foo(a : 10)
}

协程

async fun test2() : Int {
    var i = 0
    i = await testCallback()
    return i + 1
}