2013-10-30 206 views
1

我有一個大規模的記錄,我正在尋找比較使用它。有沒有辦法在比較中忽略記錄中的一個字段,還是必須單獨檢查每個字段?Ada - 忽略記錄比較

例如:

type Apple_T is record 
    Redness_Scale : Integer; 
    Weight : Natural: 
    Age : Natural; 
    Eaten : Boolean; 
end record; 

我要上發紅,體重和年齡進行比較,但不能食用。有沒有一種方法可以在沒有三個獨立的狀態的情況下做到這一點?

+0

您對哪些比較感興趣? 「=」,「<」和/或別的什麼? –

回答

5

不,你必須編寫代碼就像

return (Left.Redness_Scale = Right.Redness_Scale) and then 
     (Left.Weight = Right.Weight) and then 
     (Left.Age = Right.Age); 

(假設你有一個返回布爾測試蘋果是否同樣比較函數)。從技術上講,這些不是三個獨立的陳述。但是,不,您定義記錄的方式,您必須使用三次相等比較。

然而,你可能要考慮的是一個蘋果(而不是行動,有人已經在蘋果)的原「特色」可能是值得變成自己的抽象,像

type Apple_Characteristics is record 
    Redness_Scale : Integer; 
    Weight : Natural: 
    Age : Natural; 
end record; 

type Apple_T is record 
    Characteristics : Apple_Characteristics; 
    Eaten : boolean; 
end record; 

現在您可以將兩個記錄的Characteristics組件與一個相等測試進行比較。這是區分特徵的一個好處,但也可能有其他特徵;如果這些字段足夠相關,以至於比較會將這些字段組合在一起並忽略其他字段,那麼可能還有其他操作將這些字段作爲一個組來處理。

這意味着您必須使用A.Characteristics.Weight(例如)來查看字段。但是假設你已經完成了你應該做的並且使得私有類型以及爲包的其他用戶提供的操作(過程/函數),那麼需要添加.Characteristics僅在定義的包的主體中出現當它實現這些操作時,它將會是Apple_T。將Apple_Characteristics分隔成另一種記錄類型是包的用戶不需要知道的實現細節。

1

對於帶標記的記錄類型,您可以聲明自己的相等運算符。

它的聲明必須單獨執行每個需要的比較,或者訴諸ajb更緊湊的解決方案(可以將其重寫爲擴展Apple_Characteristics類型而不是將其作爲組件包含)。

所以等號運算符的聲明可能涉及三個語句,但其使用將是緊湊的。

+1

您可以爲任何類型聲明您自己的相等運算符。它不限於標記記錄。 – ajb

+0

更好!出於某種原因,我將這種能力與標記類型相關聯;也許只是我通常使用它的方式。 –

2

您始終可以覆蓋類型的默認「=」操作。

function "=" (Left, Right : Apple_T) return Boolean is 
begin 
    return Left.Redness_Scale = Right.Redness_Scale and 
      Left.Weight  = Right.Weight  and 
      Left.Age   = Right.Age; 
end "="; 

你的類型的例子是不好的風格。哪些值是真的是否適用於發紅?蘋果真的會失重嗎?