Skip to content

Latest commit

 

History

History

21_Reference

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
title tags
21. 所有权 IV 引用
cairo
starknet
ownership
reference

WTF Cairo极简教程: 21. 所有权 IV 引用

我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 2.2.0版本。

推特:@0xAA_Science@WTFAcademy_

WTF Academy 社群:Discord微信群官网 wtf.academy

所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo


让我们继续学习所有权的相关内容,在本章中,我们将学习如何使用 Cairo 中的引用。

引用

在 Cairo 中,如果我们希望一个函数更改参数的值同时保留其所有权,就可以使用可变引用(mutable reference)。可变引用在函数执行结束时会被隐式返回,允许函数修改它的值,并且该值在调用函数的作用域中仍可使用。

你可以使用 ref 关键字创建可变引用。

需要注意的是,只有当变量被mut修饰为可变变量时,才能使用ref修饰符作为可变引用传递,并且在传递结构体时需要满足序列化(Serde)特性。

#[derive(Drop,Serde)]
struct Rectangle {
    height: u64,
    width: u64,
}

#[external(v0)]
fn reference_example(self: @ContractState)-> Rectangle {
    let mut rec = Rectangle { height : 3, width : 10};
    use_reference(ref rec);
    return rec;
}

fn use_reference(ref rec: Rectangle) {
    let temp = rec.height;
    rec.height = rec.width;
    rec.width = temp;
}

#[external(v0)]
fn reference_array(self: @ContractState)-> Array<felt252> {
    let mut arr = ArrayTrait::new();
    fill_array(ref arr);
    return arr;
}

fn fill_array(ref arr: Array<felt252>) {
    arr.append(11);
    arr.append(22);
    arr.append(33);
}

引用其实可以认为是两个move操作,首先将传入的变量move到调用的函数中,再隐式将所有权move回来。

总结

在这一章中,我们探讨了 Cairo 中的可变引用,进一步理解了该语言如何管理变量的所有权以及如何修改它们。