上一篇我們提到,可以給予四種不同類型。今天我們來深入了解一下。
Move 的類型都可以擁有四種能力: 複製、放置、儲存、密鑰
• 允許複製具有此能力的類型的值。
◦ 允許彈出/刪除具有此能力的類型的值。
◦ 允許具有這種能力的類型的值存在於全局存儲的結構中。
◦ 允許該類型作為全局存儲操作的鍵。
然而,前一篇介紹的 Struct (自定義類型) 則可以指定能力。
struct NAME has ABILITY [, ABILITY] { [FIELDS] }
module Library {
// each ability has matching keyword
// multiple abilities are listed with comma
struct Book has store, copy, drop {
year: u64
}
// single ability is also possible
struct Storage has key {
books: vector<Book>
}
// this one has no abilities
struct Empty {}
}
如果使用沒有能力的結構會發生什麼事呢?
address 0x3 {
module M {
struct People { id: u8 }
public fun new_people(id: u8,): People {
People { id }
}
}
}
script {
use 0x1::Debug;
use 0x3::M;
fun main() {
People::new_people(1);
}
}
運行上面程式將會出現錯誤,因為 People 類型沒有 drop 能力,所以當函數結束時自動刪除將會失敗,導致 error 發生,要解決此錯誤就是在 People struct 加上 drop 能力。
error:
┌── scripts/main.move:7:11 ───
│
5 │ People::new_people(1)
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Cannot ignore values without the 'drop' ability. The value must be used
│
上面的 error 例子,我們加上 drop 能力在 struct 上就可以解決
address 0x3 {
module M {
struct People has drop { id: u8 }
public fun new_people(id: u8,): People {
People { id }
}
}
}
如果要創建一個副本,就必須使用關鍵字 copy 來實現(後面會詳細介紹),而 struct 如果沒有特別給予複製能力,執行時會發生錯誤。
script {
use 0x1::Debug;
use 0x3::M;
fun main() {
let myPeople = People::new_people(1);
let _ = copy myPeople;
}
}
┌── scripts/main.move:7:20 ───
│
let _ = copy myPeople
│ ^^^^^^^^^^^^ Invalid 'copy' of owned value without the 'copy' ability
│
允許具有這種能力的類型的值存在於全局存儲中的結構(資源)內部,但不一定作為全局存儲中的頂級資源。這是唯一不直接控制操作的能力。
key 能力對所有全局存儲操作進行了門控,因此為了使類型與move_to
、borrow_global
、move_from
等一起使用,該類型必須具有該key
能力。請注意,操作仍然必須在key
定義類型的模塊中使用。
總結:
Store 和 Key 能力我們在後面篇章會看到更多程式範例,讓我們 Move to Day11