新增功能
Mojo 现在支持默认参数值。例如:
fn foo[a: Int = 3, msg: StringLiteral = "woof"]():
print(msg, a)
fn main():
foo() # prints 'woof 3'
foo[5]() # prints 'woof 5'
foo[7, "meow"]() # prints 'meow 7'
推断的参数值优先于默认值:
@value
struct Bar[v: Int]:
pass
fn foo[a: Int = 42, msg: StringLiteral = "quack"](bar: Bar[a]):
print(msg, a)
fn main():
foo(Bar[9]()) # prints 'quack 9'
结构还支持默认参数:
@value
struct DefaultParams[msg: StringLiteral = "woof"]:
alias message = msg
fn main():
print(DefaultParams[]().message) # prints 'woof'
print(DefaultParams["meow"]().message) # prints 'meow'
新的文件模块增加了基本的文件 I/O 支持。您现在可以编写:
var f = open("my_file.txt", "r")
print(f.read())
f.close()
或
with open("my_file.txt", "r") as f:
print(f.read())
Mojo 现在允许上下文管理器在不实现对方法的支持的情况下支持方法,从而实现如下习惯用语:enterexit
# This context manager consumes itself and returns it as the value.
fn __enter__(owned self) -> Self:
return self^
在这里,Mojo 无法调用 noop 方法,因为该方法使用了上下文管理器。这可以用于传统上与语句一起使用的类型(如文件描述符),即使 Mojo 保证的早期销毁不需要这样做。exitenterwith
在Mojo中实现了一个非常基本的版本。在接下来的几个版本中,该模块将得到改进,以实现与 Python 的功能对等。pathlib
该模块现在包含一个函数。这是一个低级操作,可在指针和标量之间启用位转换。memory.unsafebitcast
参数化的输入参数现在可以作为类型或类型变量的属性引用直接访问。例如:
@value
struct Thing[param: Int]:
pass
fn main():
print(Thing[2].param) # prints '2'
let x = Thing[9]()
print(x.param) # prints '9'
甚至可以在参数上下文中访问值的输入参数。例如:
fn foo[value: Int]():
print(value)
let y = Thing[12]()
alias constant = y.param + 4
foo[constant]() # prints '16'
Mojo REPL 现在支持代码补全。边键入边按可查询可能的完成结果。Tab
来自 Python 的错误消息现在在 Mojo 中公开。例如,应打印以下内容:No module named 'my_uninstalled_module'
fn main():
try:
let my_module = Python.import_module("my_uninstalled_module")
except e:
print(e)
错误消息现在可以存储动态消息。例如,以下内容应打印“Failed on: Hello”
fn foo(x:String) raises:
raise Error("Failed on: " + x)
fn main():
try:
foo("Hello")
except e:
print(e)