Recursos
Recursos são muito parecidos com estruturas, pois possuem dados e funções dentro deles. No entanto, eles não podem ser copiados e devem ser explicitamente destruídos ou armazenados em algum lugar.
Aqui estão alguns fatos sobre recursos:
- Eles só podem ser criados no contrato usando a palavra-chave
create
. - Eles são movidos usando o operador
<-
. - Seu tipo é prefixado com um
@
. - Eles podem definir funções
destroy
que serão executadas quando forem destruídos. - Eles não podem ser copiados ou perdidos.
cadence
// Contract file: Test.cdc
// Deployed to 0x01
pub contract Test {
pub var totalSupply: UInt64
pub resource NFT {
pub let id: UInt64
pub let rarity: String
pub var name: String
pub fun changeName(newName: String) {
self.name = newName
}
// Will get run when the resource is created
init(rarity: String, name: String) {
// every resource has a unique `uuid` field
// that will never be the same, even after the resource is destroyed
self.id = self.uuid
self.rarity = rarity
self.name = name
Test.totalSupply = Test.totalSupply + 1
}
// Will get run when the resource is destroyed
destroy() {
Test.totalSupply = Test.totalSupply - 1
}
}
// resource types have a `@` in front
pub fun mintNFT(rarity: String, name: String): @NFT {
let nft <- create NFT(rarity: rarity, name: name)
return <-nft
}
init() {
self.totalSupply = 0
}
}
cadence
// Transaction file: mint_and_destroy_nft.cdc
import Test from 0x01
transaction(rarity: String, name: String) {
prepare(signer: AuthAccount) {
}
execute {
let nft: @Test.NFT <- Test.mintNFT(rarity: rarity, name: name)
log(Test.totalSupply) // 1
// we must destroy the resource or store it somewhere,
// or we will get a `loss of resource` error
destroy nft
log(Test.totalSupply) // 0
/*
ERROR: `nft` no longer exists here
log(nft.name)
*/
}
}