专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
蚂蚁技术AntTech  ·  报名开启 | ... ·  4 小时前  
蚂蚁技术AntTech  ·  语言智能并非自回归机制独有,详解扩散语言模型 ... ·  4 小时前  
程序员技术  ·  某程序员:感觉身边35岁后月薪稳定在40k以 ... ·  5 小时前  
程序员的那些事  ·  余承东暗讽某大厂,雷军疑似回应“诋毁是仰望” ... ·  3 天前  
稀土掘金技术社区  ·  掘金 AI 编程社区- 人人都是 AI 编程家竞赛 ·  4 天前  
51好读  ›  专栏  ›  OSC开源社区

挑战Rust和Scala,这门新语言震惊德国开发者!

OSC开源社区  · 公众号  · 程序员  · 2025-04-04 16:16

正文

请到「今天看啥」查看全文


/// This is the representation of a place on a chess board.
/// It can be empty (None) or contain a piece with a color: Some((piece, color)).
pub typealias BoardPlace = Option [(Piece, Color)]

通过这种定义方式,在代码中任何位置,我们都可以用 BoardPlace 代替对应的 Option 类型,反之亦然。这只是右侧类型定义的简化表达方式。另外,值得注意的是, Option 数据类型内置于MoonBit语言的标准库中,与Rust和Scala类似。MoonBit还内置了 Result 数据类型,它与Scala中的 Either 类型类似,但更专注于错误处理。

4、模式匹配

模式匹配(Pattern Matching) 对熟悉Haskell、Scala或Rust的开发者而言,“模式匹配”是一个常见概念。在MoonBit中,可以通过如下方式定义一个使用模式匹配的函数:

fn draw(self: BoardPlace) -> String {
    match self {
        None => "." // empty place
        Some((piece, Color::White)) => pieceToString.get*or_default(piece, ".")
        Some((piece, Color::Black)) => pieceToString.get_or_default(piece, ".").to_lower()
    }
}

这里, pieceToString 是一个映射(map):

let pieceToString: Map[Piece, String] = Map::of([
    (Piece::Pawn, "P"),
    (Piece::Rook, "R"),
    (Piece::Knight, "N"),
    (Piece::Bishop, "B"),
    (Piece::Queen, "Q"),
    (Piece::King, "K")
])

上述函数的输入是 BoardPlace 类型,输出则是表示棋盘上该位置棋子的字符串。此外,你还可以使用特殊的通配符 *,来匹配所有未被前面的模式匹配到的其他情况。

需要注意的是,在MoonBit中, match if 关键字都是表达式(expressions),而非语句(statements)。因此,它们会返回一个值。

与Scala类似,在一个由花括号 {} 围成的代码块中,最后一个表达式的值即为该代码块的返回值。这一点在函数中同样适用,例如:

pub fn abs(a: Int) -> Int {
    let absolute: Int = if a >= 0 { a } else { -a }
        return absolute
}

当省略掉return关键字时,也能达到完全相同的效果:

pub fn abs(a: Int) -> Int {
    let absolute: Int = if a >= 0 { a } else { -a }
    absolute
}

然而,在某些场景中,使用显式的 return 语句仍然是非常有用的,特别是当你希望提前返回(early return),跳过函数剩余逻辑处理特定情况时:

pub fn early_return(a: String-> Bool {
    if a == "." {
        return false
}

// go on with the function logic:
// at this point you know that a is NOT “.”
// ...
}

5、结构体类型

结构体(struct)类型允许通过组合多个不同类型的字段来构造出新的数据类型。这种机制类似于其他编程语言中的类(class),特别是在结构体中加入方法定义以及信息隐藏(封装)时,更是如此。

例如,我们可以这样定义棋盘上的一行(Row):

/// This is a struct that represents a row in the board
pub struct Row {
    // Array type definition:
    priv cols: Array[BoardPlace] // information hiding: private fields
derive(Show, Eq)

再定义整个棋盘(Board)的网格结构以及棋盘当前的状态(BoardState):

/// This is a struct that represents the board grid
pub struct Board {
    priv grid: Array[Row]
}
/// This is a struct that represents the board state
pub struct BoardState






请到「今天看啥」查看全文