.
函数

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

函数

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)]修饰器使它们具有外部访问性。