將相依性新增至組態相依數據
*Switch/*Case 指示詞會使數據依賴於使用 *Feature/*Option 指示詞所定義的參數。 *Switch construct 的建構標記會為定義於 *Feature construct 的其中一個參數命名。 *Switch 構造的標籤對參數的引用,可能在其透過 *Feature 構造的定義之前。
*Switch 建構的主體包含數個 *Case 建構和可選的 *Default 建構。 其他子專案不能出現在 *Switch 建構中。 *Case 建構的標記會命名在 *Option 建構中所定義的允許值之一,此值對應於 *Switch 建構中所命名的參數。 建構標記不適用於*Default 建構。
*Switch 建構可以顯示為任何其他建構中的子專案,不同之處在於 *Switch 建構不能是另一個 *Switch 建構的子系。 *Case 建構的主體可以包含任何 GDL 專案,但 *Case 建構不能是 *Feature 或 *Default 建構的上階。
*Switch/*Case 指令的運作方式與 C 語言中相同名稱的結構非常類似。 任何 *Case 建構的內容(其建構標記在組態中命名為 *Switch 建構所命名的參數目前值或狀態)都允許出現在快照中。 否則,解析器會防止 *Case 建構中包含的條目出現在快照中。
附注 不同於 C 版的 *Switch/*Case,GDL 不需要使用 break 語句來防止在 *Case 結構結束後繼續執行。
如果省略*Case 建構的主體(也就是,*Case 顯示為屬性而非建構),則會使用下一個 *Case 或 *Default 建構的主體。 此行為再次類似於 C 語言 Switch/Case的行為。 如果 *預設 建構存在,則所有 *Case 項目之後,它必須最後出現。
如果參數允許 PICKMANY,則多個 *Case 建構的內容可能會出現在快照中。 這種情況可能會導致相同建構或屬性的多個定義。 這些多重定義的處理方式,就如同它們在 GDL 檔案中任何 *Switch/*Case 建構之外明確出現時的處理一樣。 如果多個 *Case 結構共用相同的主體,且在配置中多個被命名時,主體的內容只會顯示一次。
如果在組態中未命名任何 *Case 建構,則會使用 *Default 建構的內容。 如果未定義任何 *Default 建構,則會從快照集排除整個 *Switch/*Case 建構及其所有子代專案。
如果定義多個同層級 *Switch/*Case 建構,則每個建構都會獨立評估。 同層級建構的合併不適用於 *Switch/*Case 建構。
*Switch 和 *Construct 指示詞永遠不會出現在快照中,因此,在快照中,*Case建構的子專案會成為 *Switch 建構父系的子專案。
在下列程式代碼範例中,已定義 Today 參數,以表示一周的天數。 範例中顯示兩個兄弟 *Switch/和 *Case 結構,兩者會被獨立評估。
*Schedule:
{
*Switch: Today
{
*Case: Saturday
*Case: Sunday
{
*Eat: Breakfast, Dinner
}
*Case: Monday
*Case: Wednesday
*Case: Friday
{
*Eat: Lunch
}
}
*Switch: Today
{
*Case: Sunday
{
*ToDo: Laundry
}
*Case: Saturday
{
*ToDo: Ballgame
}
*Default:
{
*ToDo: FixBugs
}
}
}
如果組態指定 Today: Saturday
,快照集將會包含下列程序代碼。
*Schedule:
{
*Eat: Breakfast, Dinner
*ToDo: Ballgame
}
如果組態指定 Today: Wednesday
,快照集將會包含下列程序代碼。
*Schedule:
{
*Eat: Lunch
*ToDo: FixBugs
}
如果組態指定 Today: Tuesday
,快照集將會包含下列程序代碼。
*Schedule:
{
*ToDo: FixBugs
}
下列程式代碼範例顯示兩個巢狀結構 *Switch/*Case 構造。
*Schedule:
{
*Switch: Today
{
*Case: Sunday
{
*Switch: Weather
{
*Case: Sunny
{
*ToDo: Garden
}
*Case: Cloudy
{
*ToDo: Laundry
}
}
}
*Case: Saturday
{
*ToDo: Ballgame
}
*Default:
{
*ToDo: FixBugs
}
}
}