此文为向 @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: