[Procedural Programming + Ada] Bài 8 – Record Defaults & Discriminants

Mặc dù việc thiết lập giá trị mặc định cho các trường dữ liệu khi khởi tạo record được Ada hỗ trợ ở cấp độ cú pháp của ngôn ngữ. Tuy nhiên ở bài viết giới thiệu về record trước đó, mình đã tránh đề cập tới để duy trì định nghĩa record đơn giản

Mặc dù việc thiết lập giá trị mặc định cho các trường dữ liệu khi khởi tạo record được Ada hỗ trợ ở cấp độ cú pháp của ngôn ngữ. Tuy nhiên ở bài viết giới thiệu về record trước đó, mình đã tránh đề cập tới để duy trì định nghĩa record đơn giản và tập trung vào các yếu tố định kiểu dữ liệu. Và bây giờ đã là thời điểm phù hợp để chúng ta có thể tìm hiểu nhiều hơn về record trong Ada.

Record Defaults

Để thiết lập giá trị mặc định cho các trường dữ liệu của record, thao tác cần thực hiện chỉ đơn giản là gắn thêm một phép gán vào sau các yếu tố định kiểu dữ liệu giống với các ngôn ngữ như TypeScript hay Kotlin.

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
   type Date is record
      Day   : Integer range 1 .. 31   := 1;
      Month : Integer range 1 .. 12   := 1;
      Year  : Integer range 1 .. 3000 := 1900;
   end record;

   Birthday : Date;
begin
   Put_Line ("Birthday : record Date");
   Put_Line ("   Day   => " & Integer'Image (Birthday.Day));
   Put_Line ("   Month => " & Integer'Image (Birthday.Month));
   Put_Line ("   Year  => " & Integer'Image (Birthday.Year));
end Main;

Và thực tế thì tất cả các biến được khai báo ở bất kỳ vị trí nào, bao gồm các tham số của các sub-program và các biến cục bộ cũng đều có thể được gắn giá trị mặc định với thao tác tương tự (nếu cần thiết).

Birthday : record Date
   Day   =>  1
   Month =>  1
   Year  =>  1900

Discriminant

Các record cũng có thể được định nghĩa kèm theo discriminant. Điều này cũng rất cần thiết nếu như chúng ta đang thiết kế record có chứa các array và muốn để cho code sử dụng bên ngoài quyết định độ rộng của array bên trong record ở thời điểm định kiểu dữ liệu cho biến lưu trữ.

subtype Positive_Integer is Integer range 1 .. Integer'Last;
type Item_List (size : Positive_Integer) is record
   Name : String;
   List : array (1 .. size) of String;
end record;

Ngoài ra thì các yếu tố discriminant còn được sử dụng để định nghĩa variant record – tạm hiểu là kiểu record có cấu trúc thay đổi tùy thuộc vào yếu tố discriminiant được cung cấp ở thời điểm định kiểu cho một biến nào đó. Các variant record của Ada được so sánh tương đương với union trong C hay C++ và các kiểu dữ liệu gộp sum type trong các ngôn ngữ FP như Elm hay Haskell.

Tuy nhiên vì một vài lý do chủ quan về mặt cú pháp ngôn ngữ, mình sẽ không sử dụng các variant record trong suốt Sub-Series này và chỉ trích dẫn liên kết tham khảo ở đây nếu bạn quan tâm learn.adacore.com > Variant Records.

[Procedural Programming + Ada] Bài 9 – Access Pointer & Recursive Record

Nguồn: viblo.asia

Bài viết liên quan

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 2

viết lại nội dung này ” Phát hiện các cuộc tấn công Cross Site Scripting (XSS)

AI Chatbot 2025: Xu Hướng Tất Yếu Cho Doanh Nghiệp Dẫn Đầu

Giới thiệu AI chatbots đã trải qua một hành trình đáng kể, từ những công cụ t

Tấn Công Ứng Dụng Web: Mối Đe Dọa Hàng Đầu – Phần 1

Tấn công web là gì? Ứng dụng web là các ứng dụng cung cấp dịch vụ cho người

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp

SEO Mũ Trắng, Mũ Đen, Mũ Xám: Hiểu Biết và Lựa Chọn Phù Hợp Trong kỷ nguyên s