Có một vài điều bạn có trong mã của bạn ở đây:
Loại viết tắt (Link)
type Position = Vector2
type Velocity = Vector2
type Appearance = String
Loại chữ viết tắt chỉ xác định một tên khác cho một loại hiện có, các loại trên bên trái và bên phải và chính xác tương đương và có thể được sử dụng thay thế cho nhau.
Để đưa ra ví dụ thích hợp cho câu hỏi này, trong F # có chữ viết tắt loại cho tiêu chuẩn .NET List
, được gọi là ResizeArray
. Nó được định nghĩa như thế này:
type ResizeArray<'T> = System.Collections.Generic.List<'T>
Nó giúp bạn tiết kiệm phải mở System.Collections.Generic
để sử dụng nó và nó giúp để tránh nhầm lẫn với các list
gõ F # nhưng nó không làm bất cứ điều gì khác hơn là thêm một tên mới cho một loại hiện có.
đoàn Disciminated (Link)
type Component = Position | Velocity | Appearance
Ở đây bạn có một loại duy nhất được gọi là Component
, bạn có thể nghĩ về nó như một loại duy nhất với ba cấu trúc: Position
, Velocity
và Appearance
. Bạn cũng có thể deconstruct các loại một lần nữa bằng cách sử dụng cùng ba trường hợp bằng cách phù hợp với mô hình.
ví dụ:
match comp with
|Position -> ..
|Velocity -> ..
|Appearance -> ..
Hy vọng rằng, bây giờ nó sẽ đến như là không có gì ngạc nhiên khi các loại chữ viết tắt Position
mà bạn tuyên bố không có mối liên hệ với các trường hợp công đoàn Position
mà bạn khai báo là một phần của các loại Component
. Họ hoàn toàn độc lập với nhau.
Position
có nghĩa là Vector2
và Component
là loại liên minh hoàn toàn riêng biệt.
Giả sử bạn muốn loại Component
có thể chứa nhiều thứ, bạn sẽ cần kết hợp một số giá trị với các trường hợp. Dưới đây là một ví dụ của việc tạo ra như một liên minh phân biệt đối xử:
type Component =
| Position of Vector2
| Velocity of Vector2
| Appearance of string
Bây giờ, chúng ta hãy nhìn vào vấn đề tiếp theo.
Nếu chúng ta xóa các từ viết tắt kiểu và thử còn lại của mã với phân biệt đối xử liên minh mới của chúng tôi
let components = List<Dictionary<string, Component>>()
let pos = Dictionary<string, Position>()
Bây giờ chúng ta có một lỗi mới:
The type Position
is not defined.
Vâng, hãy nhớ những gì tôi đã nói trước đó khoảng Component
. Component
là loại, Position
không phải là một loại, đó là trường hợp công đoàn của Component
.
Nếu bạn muốn chứa toàn bộ từ điển của cùng một trong các tùy chọn này, bạn có thể được tốt hơn thay đổi định nghĩa của bạn để một cái gì đó như thế này:
type ComponentDictionary =
|PositionDictionary of Dictionary<string, Vector2>
|VelocityDictionary of Dictionary<string, Vector2>
|AppearanceDictionary of Dictionary<string, string>
Sau đó, bạn có thể tạo ra một ResizeArray
/List
trong số này.
let components = ResizeArray<ComponentDictionary>()
Bây giờ, để dân bộ sưu tập này, chúng ta sau đó chỉ cần sử dụng các nhà xây dựng trường hợp thích hợp cho ComponentDictionary
let pos = PositionDictionary (Dictionary<string, Vector2>())
Bây giờ, pos là loại ComponentDictionary
vì vậy chúng tôi có thể thêm nó vào các thành phần:
components.Add(pos) // No error here!
Bạn có hiểu rằng Component.Position và vị trí không giống nhau không? –