Tổng quan

Trong thế giới ngôn ngữ lập trình, chúng ta cần một chiếc cầu nối giữa các đối tượng, một cách để truy cập và thao tác dữ liệu mà không làm thay đổi bản chất của chúng. Đó chính là “Reference” – khái niệm quan trọng trong lập trình, ra đời như một giải pháp thông minh. Trong Cadence, ngôn ngữ lập trình dành riêng cho Flow – một nền tảng blockchain đầy tiềm năng, Reference đóng vai trò chủ chốt trong việc giúp lập trình viên làm việc hiệu quả và linh hoạt hơn với các Cấu trúc (Struct) và Tài nguyên (Resource).

Hãy cùng GFI tìm hiểu về Reference nhé!

Lập trình Cadence

Reference

Trong Cadence, các tham chiếu (reference) hầu như luôn được sử dụng trên Cấu trúc (Struct) hoặc Tài nguyên (Resource). Thực sự không có ý nghĩa gì khi tạo tham chiếu của một chuỗi, số hoặc kiểu dữ liệu cơ bản. Nhưng nó chắc chắn có ý nghĩa để tham khảo những thứ mà chúng ta không muốn vượt qua nhiều.

Reference luôn sử dụng ký hiệu & phía trước, có dạng &T, trong đó T là loại đối tượng được tham chiếu. Chúng được tạo bằng toán tử & và loại tham chiếu phải được cung cấp rõ ràng.

Flow Reference
Reference

Hãy xem một ví dụ:

pub contract Test {

    pub var dictionaryOfGreetings: @{String: Greeting}

    pub resource Greeting {
        pub let language: String
        init(_language: String) {
            self.language = _language
        }
    }

    pub fun getReference(key: String): &Greeting? {
        return &self.dictionaryOfGreetings[key] as &Greeting?
    }

    init() {
        self.dictionaryOfGreetings <- {
            "Hello!": <- create Greeting(_language: "English"), 
            "Bonjour!": <- create Greeting(_language: "French")
        }
    }
}

Trong ví dụ trên, bạn có thể thấy rằng getReference trả về &Greeting? loại, có nghĩa đơn giản là “Một tham chiếu tùy chọn cho loại @Greeting.” Bên trong chức năng, một vài điều đang xảy ra:

  1. Trước tiên, chúng ta nhận được tham chiếu của giá trị key bằng cách thực hiện &self.dictionaryOfGreetings[key].
  2. Chúng ta “gõ truyền” tham chiếu bằng cách thực hiện nhưas &Greeting?. Lưu ý rằng nó là một tùy chọn, điều này có ý nghĩa bởi vì khi chúng ta lập chỉ mục trong từ điển, nó sẽ trả về một loại tùy chọn.

Lưu ý rằng nếu chúng ta quên as &Greeting?, Cadence sẽ nói “biểu cảm được mong đợi.” Điều này là do trong Cadence, bạn phải gõ cast khi lấy tham chiếu. Truyền kiểu là khi bạn cho Cadence biết kiểu mà bạn đang nhận được tham chiếu, đó là &Greeting? đang làm. Nó nói “lấy tham chiếu tùy chọn này là tham chiếu as &Greeting?“. Nếu không, chúng ta sẽ hủy bỏ chương trình.

Bây giờ, bạn có thể tự “làm thế nào tôi có thể mở mã tham chiếu tùy chọn này?” Bạn có thể làm điều đó như vậy:

pub fun getReference(key: String): &Greeting {
    return (&self.dictionaryOfGreetings[key] as &Greeting?)!
}

Lưu ý rằng chúng ta quấn toàn bộ và sử dụng toán tử force-unwrap ! để mở nó ra, như bình thường. Nó cũng thay đổi kiểu trả về thành &Greeting không tùy chọn. Đảm bảo thay đổi điều này trong mã của bạn.

Bây giờ chúng ta có thể lấy tham chiếu, chúng ta có thể lấy tham chiếu trong giao dịch hoặc tập lệnh như sau:

import Test from 0x01

pub fun main(): String {
  let ref = Test.getReference(key: "Hello!")
  return ref.language // returns "English"
}

Cộng đồng hệ sinh thái Flow Việt Nam

Kết luận

Thông qua việc sử dụng tham chiếu (reference) trong Cadence, chúng ta có thể quản lý và truy cập vào các giá trị của Cấu trúc (Struct) và Tài nguyên (Resource) một cách hiệu quả và linh hoạt hơn. Việc hiểu cách tạo và sử dụng tham chiếu, cũng như biết cách thực hiện gõ truyền và mở mã tham chiếu tùy chọn, là rất quan trọng để tận dụng tối đa sức mạnh của Cadence.

Với ví dụ mẫu trên, chúng ta đã thấy cách lấy tham chiếu từ một từ điển, chuyển đổi kiểu dữ liệu và sử dụng tham chiếu trong giao dịch hoặc tập lệnh. Hãy tiếp tục khám phá và sử dụng các khái niệm về tham chiếu trong Cadence để phát triển những ứng dụng phức tạp và mạnh mẽ hơn.