如何创建初始值为空的、类型是复杂类型的 全局变量?

1、MoonBit 怎么创建全局变量?

2、如果一个全局变量是一个 struct 类型,比如一个俄罗斯方块游戏的结构:

struct  Tetris {
  mut dead : Bool
  mut score : Int
}

type Canvas_ctx

如果想让它在初始化的时候设为 None ,比如:

let teris: Tetris | None = None

或:

let canvas : Canvas_ctx = None

且等到特定时刻再赋上非空值,要怎么写?

我的目的是希望可以有一个全局变量来 hold 住某个参数,要用的时候再在 moonbit 中直接用,而不必在 JavaScript 端频繁传入参数。

可以用Option

let tetris : Option[Tetris] = None
1 个赞

可以声明一个带可变字段的struct Context:

struct Context{
  mut tetris : Option[Tetris]
}

let global : Context = { tetris : None }

func init {
  global.teris = Some( ... )
}

或者使用内置的struct Ref

let tetris : Ref[Option[Tetris]] = { val : None }

func init {
  tetris.val = Some( ... )
}

我们后续会在标准库中提供更多的工具来简化Ref[T]的使用

2 个赞
type Canvas_ctx

func begin_path(self: Canvas_ctx) = "canvas" "begin_path"
func arc(self: Canvas_ctx, x: Int, y: Int, radius: Int, start_angle: Float, end_angle: Float, counterclockwise: Bool) = "canvas" "arc"
func move_to(self: Canvas_ctx, x: Int, y: Int) = "canvas" "move_to"
func stroke(self: Canvas_ctx) = "canvas" "stroke"
func get_pi() -> Float = "canvas" "get_pi"

let pi: Float = get_pi()

pub func draw(self: Canvas_ctx) {
    self.begin_path();
    self.arc(75, 75, 50, 0.0, pi * 2.0, true); // Outer circle
    self.move_to(110, 75);
    self.arc(75, 75, 35, 0.0, pi, false); // Mouth (clockwise)
    self.move_to(65, 65);
    self.arc(60, 65, 5, 0.0, pi * 2.0, true); // Left eye
    self.move_to(95, 65);
    self.arc(90, 65, 5, 0.0, pi * 2.0, true); // Right eye
    self.stroke();
}

最后剩下一个疑问了,在 draw 函数中,有没有办法把 Canvas_ctx 类型的参数存到一个全局变量,在代码第一行写着 type Canvas_ctx ,我不太清楚这个 type 和 struct 有什么区别,能不能使用这种声明形式 :

let canvas: Option[Canvas_ctx ] = None

如果能存到一个大的结构中,那也可以,比如:

struct Context{
  mut canvas: Option[Canvas_ctx ]
}

不知道行不行,我晚上回去试试

type 用来声明一个抽象类型,struct 用来声明一个结构体类型

目前的话 Canvas_ctx 这个类型的使用方式比较受限,不可以出现在结构体或者闭包里,之后等 wasm gc 支持了之后就会放松这个限制

3 个赞