Mojo SDK 的第二个版本还有更多值得喜爱的 Mojo!此版本包括新功能、API 更改和错误修复。
还有适用于 VS Code 的 Mojo 扩展的更新版本。
新增功能:
Mojo 现在部分支持将关键字参数传递给函数和方法。例如,以下方法应有效:
fn foo(a: Int, b: Int = 3) -> Int:
return a * b
fn main():
print(foo(6, b=7)) # prints '42'
print(foo(a=6, b=7)) # prints '42'
print(foo(b=7, a=6)) # prints '42'
也可以从关键字参数推断参数,例如:
fn bar[A: AnyType, B: AnyType](a: A, b: B):
print("Hello 🔥")
fn bar[B: AnyType](a: StringLiteral, b: B):
print(a)
fn main():
bar(1, 2) # prints `Hello 🔥`
bar(b=2, a="Yay!") # prints `Yay!`
目前,存在以下值得注意的限制:
不支持仅关键字参数:
fn baz(*args: Int, b: Int): pass # fails
fn baz(a: Int, *, b: Int): pass # fails
(PEP 3102 中描述了仅关键字参数。
不支持可变参数关键字参数:
fn baz(a: Int, **kwargs: Int): pass # fails
Mojo 现在支持装饰器。目的是标记只应存在于参数域中的数据类型。要使用它,结构体用 .每当从参数域转换不可具体化类型时,它都会自动转换为 。不可具体化的结构体应将其所有方法注释为 ,并且必须在参数域中可计算。在以下示例中,可以在参数域中添加类型,但在具体化时转换为该类型。@nonmaterializable@nonmaterializable(TargetType)TargetType@always_inlineNmStructHasBool
@value
@register_passable("trivial")
struct HasBool:
var x: Bool
fn __init__(x: Bool) -> Self:
return Self {x: x}
@always_inline("nodebug")
fn __init__(nms: NmStruct) -> Self:
return Self {x: True if (nms.x == 77) else False}
@value
@nonmaterializable(HasBool)
@register_passable("trivial")
struct NmStruct:
var x: Int
@always_inline("nodebug")
fn __add__(self: Self, rhs: Self) -> Self:
return NmStruct(self.x + rhs.x)
alias stillNmStruct = NmStruct(1) + NmStruct(2)
# When materializing to a run-time variable, it is automatically converted,
# even without a type annotation.
let convertedToHasBool = stillNmStruct
Mojo 整数文字现在在参数域中使用时会生成无限精度的整数类型。 具体化为运行时计算的类型,但在编译时使用支持的运算符进行中间计算时,现在可以超过该类型的位宽。IntLiteralIntLiteralIntInt
Mojo 语言服务器现在支持顶级代码补全,在键入对变量、类型等的引用时启用补全。这解决了 #679。
Mojo REPL 现在对结果变量进行着色,以帮助区分输入表达式和输出变量。