在 Cairo 中,当数据从一个变量分配到另一个变量或作为函数参数传递时,该数据的所有权会被转移。然而,有时我们希望能够操作数据但又保留其所有权。本章将探讨几种实现此目标的方法。
1. 通过函数返回所有权
你可以设计一个函数,让它将所有权返回给原变量。示例:
虽然这种方法允许原变量重新获得所有权,但它需要你自己编写返回值,从而增加了代码的复杂性。
2. Copy
特性
如之前章节所述,如果一个类型实现了 Copy
特性,将其赋值给新变量或传递给函数时,将传递该值的副本,而不会转移所有权。
但请注意,Array
和 Dictionary
类型不能实现 Copy
特性。
3. 克隆
Cairo 允许你使用 clone()
方法手动创建一个变量的深复制(deep copy)。
clone()
的缺点是深度复制一个变量可能会消耗大量的计算资源和 gas。
4. 引用
在 Cairo 中,你可以使用 ref
关键字创建一个值的可变引用(mutable reference)。这个引用在函数结束时会隐式返回,将所有权返回给调用上下文。
请注意,只有可变变量才可以使用 ref
关键字作为引用传递。我们将在下一章更深入地探讨这个话题。
5. 快照
Cairo 中的快照(snapshot)为某个时间点上的值提供了一个不可变的视图。当一个函数接受一个快照作为参数时,它并不接管底层值的所有权。你可以使用快照操作符 @
创建快照:
我们将在第22章更深入地探讨快照。
总结
在本章中,我们学习了几种在 Cairo 中保留所有权的情况下操纵数据的实用方法。掌握他们会让你写出更好的 Cairo 合约。