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 ]
}
不知道行不行,我晚上回去试试
Yu-zh
5
type
用来声明一个抽象类型,struct
用来声明一个结构体类型
目前的话 Canvas_ctx 这个类型的使用方式比较受限,不可以出现在结构体或者闭包里,之后等 wasm gc 支持了之后就会放松这个限制
3 个赞