Cairo 101 入门

1. Hello Cairo
2. 基本类型
3. 局部和状态变量
4. 变量可变性
5. 函数
6. 元组 Tuple
7. 数组
8. 结构体
9. 枚举
10. 映射和其他类型
11. 控制流
12. 模式匹配
13. Option
14. 类型转换
15. 构造函数
.
函数

在本章中,我们将介绍 Cairo 中的函数,包括可见性不同的external和view函数。

函数

Cairo 与 Rust 类似,函数使用 fn 关键字声明。参数类型像声明变量一样需要标明,当函数返回一个值时,必须在箭头 -> 之后指定返回类型。

以下是 sum_two() 函数的示例。它接受两个 u128 类型的参数,并返回一个 u128 值。

fn sum_two(x: u128, y: u128) -> u128 {
    return x + y;
}

在类似 Rust 的语言中,函数的返回值由其函数体中的最后一个表达式确定。虽然你可以使用 return 关键字提前退出函数并指定一个值,但大多数函数会隐式返回最后一个表达式。下面的 sum_two_expression() 函数与 sum_two() 函数的行为完全相同。请注意,表达式不以分号 ; 结尾。

fn sum_two_expression(x: u128, y: u128) -> u128 {
    x + y
}

可见性

默认情况下,函数是私有的,这意味着它们只能在内部访问。但是,你可以使用#[external(0)]修饰器声明公共函数。

View

参数中包含self: @ContractState的函数是view函数。它们可以读取状态变量(self.var_name.read()),但不能更改合约的状态,例如更新状态变量或释放事件。

#[storage]
struct Storage{
    balance: u128,
    }

// view function: can read but not write storage variables.
#[external(v0)]
fn read_balance(self: @ContractState) -> u128 {
    return self.balance.read();
}

External

参数中包含self: @ContractState的函数也可以被外部访问。与 view函数不同,它们可以修改合约的状态(使用self.var_name.write(new_value)),例如更新状态变量或释放事件。

// external: can read and write storage variables.
#[external(v0)]
fn write_balance(ref self: ContractState, new_balance: u128) {
    self.balance.write(new_balance);
}

总结

在本章中,我们探讨了Cairo中的函数。虽然函数默认为私有,但你可以使用#[external(v0)]修饰器使它们具有外部访问性。

PreviousNext