Ada語言寶書 #2: Ada 2005 受限型別 — 集合中的 預設值 標記
寶書 #2: Ada 2005 受限型別
— 集合中的<>標記
by Bob Duff—AdaCore
Translator:Dongfeng.Gu
讓我們開始…
上週,我們提到Ada2005允許為受限型別提進行合聲明。這樣的一個集合必須用於初始化某個物件(其中包括引數傳遞,我們進行形式引數的初始化)。受限(物件的)集合(宣告)是在物件初始化的地方現場建立。
這裡是例程:
type Limited_Person is limited
record
Self : Limited_Person_Access := Limited_Person'Unchecked_Access;
Name : Unbounded_String;
Age : Natural;
Shoe_Size : Positive;
end record;
X : aliased Limited_Person :=
(Self => null, – Wrong!
Name => To_Unbounded_String (”John Doe”),
Age => 25,
Shoe_Size => 10);
X.Self := X'Access;
把Self設定為錯誤的值(null)然後再修正它,這看起來不舒服。同樣討厭的是對於Self我們已經有了一個(正確的)預設值,但在Ada95中,我們不能在集合中使用預設值。Ada2005中在集合中加入了一個新的語法--“<>”意思是“如果有的話請使用預設值”。
這裡,我們可以說:
X : aliased Limited_Person :=
(Self => <>,
Name => To_Unbounded_String (”John Doe”),
Age => 25,
Shoe_Size => 10);
這個 “Self => <>”意味著使用Limited_Person'Unchecked_Access預設值。既然Limited_Person出現在型別宣告中,它指向該型別的當前例項,在這裡是X。因此,我們設定X.Self 為X'Unchecked_Access 。
Note that using “<>” in an aggregate can be dangerous, because it can leave some components uninitialized. “<>” means “use the default value”. If the type of a component is scalar, and there is no record-component default, then there is no default value.
注意,在集合中使用“<>”可能產生危險,因為它可能會遺留一些未初始化成員。“<>”意味著“使用預設值”。如果一個成員的型別是標量型別,並且沒有記錄元素的預設值,接著(這個成員)將沒有預設值。
例如,如果我們有一個String型別的集合,像這樣:
Uninitialized_String_Const : constant String := (1..10 => <>);
we end up with a 10-character string all of whose characters are invalid values. Note that this is no more nor less dangerous than this:
我們用10個都是非法值的字串來結尾。注意,這並不比這更危險:
Uninitialized_String_Var : String (1..10); – no initialization
Uninitialized_String_Const : constant String := Uninitialized_String_Var;
像往常一樣,必須小心未初始化的標量物件。