Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

abilities & phantom #20

Merged
merged 1 commit into from
Dec 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions pages/Basic_Move_Programming/Generics_and_phantom.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,6 @@ fun test_swap_type_params() {


```



## Tại sao cần dùng generics ?

Qua các ví dụ trên, ta đã học cách tạo và sử dụng các kiểu generic cơ bản. Nhưng generic còn có một ưu điểm quan trọng hơn: nó cho phép chúng ta viết code một lần và dùng được cho nhiều kiểu dữ liệu khác nhau. Điều này rất tiện lợi, đặc biệt khi làm việc với các tập hợp dữ liệu (collections) và các tính năng nâng cao trong Move.
Expand All @@ -166,4 +163,35 @@ public struct User<T> {

In the example above, `User` is a generic type with a single type parameter `T`, with shared fields `name` and `age`, and the generic `metadata` field which can store any type. No matter what the `metadata` is, all of the instances of `User` will have the same fields and methods.

Trong ví dụ trên, `User` là một kiểu dữ liệu generic với một tham số kiểu `T`, có các trường chung là `name` và `age`, và trường generic `metadata` có thể lưu trữ bất kỳ kiểu dữ liệu nào. Dù `metadata` là gì đi nữa, tất cả các thể hiện của `User` đều sẽ có cùng các trường và phương thức.
Trong ví dụ trên, `User` là một kiểu dữ liệu generic với một tham số kiểu `T`, có các trường chung là `name` và `age`, và trường generic `metadata` có thể lưu trữ bất kỳ kiểu dữ liệu nào. Dù `metadata` là gì đi nữa, tất cả các thể hiện của `User` đều sẽ có cùng các trường và phương thức.


## Phantom type

Phantom generics là các tham số generic không được sử dụng trong các trường hoặc phương thức của struct.


```Rust
// A generic type with a phantom type parameter.
public struct Coin<phantom T> {
value: u64
}
```

Ví dụ chúng ta tạo một Coin không sử dụng tham số kiểu T trong bất kỳ trường hay phương thức nào. Nó chỉ dùng để phân biệt giữa các loại coin khác nhau và áp đặt các ràng buộc lên tham số kiểu T.


```rust
public struct USD {}
public struct EUR {}

#[test]
fun test_phantom_type() {
let coin1: Coin<USD> = Coin { value: 10 };
let coin2: Coin<EUR> = Coin { value: 20 };

// Unpacking is identical because the phantom type parameter is not used.
let Coin { value: _ } = coin1;
let Coin { value: _ } = coin2;
}
```
2 changes: 1 addition & 1 deletion pages/Basic_Move_Programming/_meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"struct": "Khái niệm về struct",
"ablities": "Ablities là gì?",
"Enum": "Enum là gì?",
"Generics_and_phantom": "Generic và Phantom",
"Generics_and_phantom": "Generic là gì? ",
"events_and_errors": "events và errors",
"unit_tests": "Viết testcase cho Sui move"
}
Expand Down
4 changes: 2 additions & 2 deletions pages/Basic_Move_Programming/ablities.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Khi tạo một struct (kiểu dữ liệu), chúng ta gán Abilities cho nó. S

Đây là cú pháp:

```tsx
```rust
// This struct has the abilities "copy" and "drop".
<type> <name> has copy, drop {
// field: Type1,
Expand Down Expand Up @@ -87,7 +87,7 @@ Các đối tượng có **cả khả năng key và store:**

Ví dụ:

```
```rust
// A struct without any abilities
public struct NoAbilities {}

Expand Down
Loading