此文为向 @StarknetAstroCN 的投稿。
Starkware 于 2 月 21 日公布了Cairo 1.0-alpha.3,离 Cairo 1.0 正式上线测试网(等两周后的 Starknet 0.11.0 公开)越来越快了,让我们来看看这次有什么新增特性吧。
快照是一种新增的类型(但其实在该版本之前就大量使用了),它创建了对在某个时间点的对象的引用,创建的 snapshot 不能被进一步更改。
这个类型的主要用处是给该对象产生一个引用,即使该对象是不可复制的(注:Cairo 的复制,即 copy 这个 trait 是参考了 rust 的概念,和广义上的 copy 并不太一样,参见此处)。其中, @ 是 snap 操作,而 * 是 desnap,也就是将快照对象取出的操作。
官方给出的代码有点令人混淆,我来解释一下:
这里的第一句其实是写在 Cairo 的数组源码中。
实际测试时只需要测试以下代码即可:
use array::ArrayTrait;
fn main() -> felt {
let mut arr = ArrayTrait::new();
arr.append(10);
let x = *arr.at(0_usize);
return x;
}
这将会在你的终端里输出类似于
Run completed successfully, returning [10]
这样的结果。
对于还不太明白的同学,运行如下代码:
use array::ArrayTrait;
extern fn print(message: Array::<felt>) nopanic;
fn main() -> felt {
let mut arr = ArrayTrait::new();
arr.append(10);
let xx = arr.at(0_usize);
let d = arr.pop_front();
drop(d);
arr.append(11);
print(arr);
let x = *xx;
return x;
}
你将可以看到这样的输出:
'
' (raw: 11),
Run completed successfully, returning [10]
可以看出,虽然数组变成了 [11],但输出仍然是 10。
增加了 ec_point_zero, ec_point_is_zero, ec_state_finalize.
+=, -=, *=, /=, %=
其中 Into 负责类型转换。TryInto 同样负责类型转换,但允许转换失败,会返回一个 Option (如这里的实现)。
Neg 为 Negative 的简写,为取负(如这里的实现)或者取逆操作。Not 为取非操作。
My Twitter: