Bu bölüm ağırlıklı olarak Strcut’a Move’da verilen dört yeteneği kaydeder.
- Yetenekler nelerdir?
- Dört tür ayrı ayrı açıklanmıştır: Kopyalama, Bırakma, Saklama ve Anahtarlama
- Yetenekler Sözdizimi
- Move, çok esnek ve özelleştirilebilir benzersiz bir yazı sistemine sahiptir
- Move’un tip sistemi en fazla dört niteleyici tarafından değiştirilebilir, yani dört adede kadar yeteneğe sahiptir.
- Bu dört yetenek, bir türün nasıl kullanıldığını, silindiğini veya depolandığını tanımlar.
- Copy: Değerler kopyalanabilir.RUST’ta bir Struct veya bir değişkene erişildiğinde sahipliği de elinden alınır ancak aşağıdaki fonksiyon veya değişkenin sahipliğini almasını istemiyorsak yapmamız gereken bir kopya oluştur Veya ödünç al ve Kopyala, bir kopyayı kopyalama yeteneği vermektir
- Drop: Kapsam sona erdiğinde atılabilir.Move, değişken bittiğinde işlenmesi gerektiğini kesin olarak şart koşar, bu nedenle ona bırakma yeteneği vermemiz gerekir, aksi takdirde bir hata bildirilir
- Anahtar: Global depolama işlemleri için anahtar değer olarak kullanılabilir, hesap altında depolanır ve Kaynak olarak kullanılabilir.
- Mağaza: Değer, global depolamada saklanabilir ve bu, yalnızca modülün dahili hesaplamalarının rahatlığı için tanımlanmamış, genel muhasebede saklanabilen verilerdir.
Yerel ve yerleşik türlerin yetenekleri önceden tanımlanmıştır ve tamsayıların değerleri gibi değiştirilemez, vektör, adres ve boolean türleri doğası gereği kopyalama, bırakma ve saklama yeteneğine sahiptir.
Yapının yeteneğine sözdizimi eklendi
struct <Struct Name> has ABILITY (, ABILITY) { (FIELDS) }
örnek
module Vending {
// 用逗號隔開多個abilities
struct Beverage has copy, drop, store {
year: u64
}// 單一ability也是可行的
struct Storage has key {
beverage: vector<Beverage>
}
// 沒有ability的寫法
struct Empty {}
}
Yeteneksiz Yapı niteleyicisi — Yeteneksiz Yapı
- Herhangi bir yetenek olmadan ne olabilir?
Modül
module Human {
struct Student {
student_id: u8,
point: u64
}
public fun new_student(student_id: u8, point: u64): Student {
Student {student_id, point}
}
}
Senaryo
script {
use {{sender}}::Human;
fun main() {
Human::new_student(5, 9000);
}
}
error:
┌── scripts/main.move:5:9 ───
│
5 │ Human::new_student(5, 9000);
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Cannot ignore values without the 'drop' ability. The value must be used
│
Burada Country::new_country() kullanılarak bir değer oluşturulur, ancak bu değer başka bir yere iletilmez, bu nedenle işlev yürütüldükten sonra atılmalıdır.
Ancak tanımladığımız Ülke türü, Bırakma yeteneğini eklemedi, bu nedenle yürütme sırasında bir hata bildirildi.
- Bu yapının tüm örneklerinin atılabilmesi için Student yapısına drop yeteneği ekliyoruz.
Modül
module Human {
struct Student has drop { // 添加 drop ability
student_id: u8,
point: u64
}
public fun new_student(student_id: u8, point: u64): Student {
Student {student_id, point}
}
}
Senaryo
script {
use {{sender}}::Human;
fun main() {
Human::new_student(5, 9000); // 可以順利 drop 掉
}
}
Yürütmeye hazır!
Açıklamalar: Düşürme yeteneği yalnızca düşme davranışında kullanılabilir, Yıkmak (Yıkmak) Düşürmeyi gerektirmez
- Burada bir yapıyı kopyalamak istiyoruz ve eğer Copy anahtar sözcüğü kullanılmamışsa problemler olacaktır.
script {
use {{sender}}::Human;
fun main() {
let student = Human::new_student(5, 9000);
let _ = copy student;
}
}
yürütme sırasında sorunlar
┌── scripts/main.move:6:17 ───
│
6 │ let _ = copy student;
│ ^^^^^^^^^^^^ Invalid 'copy' of owned value without the 'copy' ability
│
Yapıya kopyalama yeteneği ekleyin
module Human {
struct Student has drop, copy { // 添加 copy 和 drop ability
student_id: u8,
point: u64
}
public fun new_student(student_id: u8, point: u64): Student {
Student {student_id, point}
}
}
Yürütmeye hazır!
- İlkel Türlerin kendi saklama, kopyalama ve bırakma yetenekleri vardır
- Varsayılan olarak, yapının (Struct) herhangi bir yeteneği yoktur.
- Kopyala ve Bırak yetenekleri, ayrı ayrı kopyalanıp bırakılabilen değerleri tanımlar
- Bir yapı en fazla 4 yeteneğe sahip olabilir