我有一個處理元素隊列的while (!Queue.empty())
循環。有一系列從最高優先級到最低優先級的模式匹配器。匹配模式時,相應的元素將從隊列中移除,並從頂部重新開始匹配(以便優先級最高的匹配器有機會首先執行)。如何重構此while循環以擺脫「繼續」?
所以現在它看起來像這樣(簡化版本):
while (!Queue.empty())
{
auto & Element = *Queue.begin();
if (MatchesPatternA(Element)) { // Highest priority, since it's first
// Act on it
// Remove Element from queue
continue;
}
if (MatchesPatternB(Element)) {
// Act on it
// Remove Element from queue
continue;
}
if (MatchesPatternC(Element)) { // Lowest priority, since it's last
// Act on it
// Remove Element from queue
continue;
}
// If we got this far, that means no pattern was matched, so
// Remove Element from queue
}
這工作,但我想重構這個循環中的一些方法,以消除使用關鍵字continue
的。
爲什麼?因爲如果我想外部匹配一個外部函數的模式,它顯然會中斷。例如。
void ExternalMatching(...)
{
if (MatchesPatternB(Element)) {
// Act on it
// Remove Element from queue
continue; // This won't work here
}
}
while (!Queue.empty())
{
auto & Element = *Queue.begin();
if (MatchesPatternA(Element)) {
// Act on it
// Remove Element from queue
continue;
}
ExternalMatching(...);
if (MatchesPatternC(Element)) {
// Act on it
// Remove Element from queue
continue;
}
// If we got this far, that means no pattern was matched, so
// Remove Element from queue
}
我不希望有寫重複的,如果像if (ExternalMatching(...)) { ... continue; }
聲明,我寧願找到表達這種邏輯更清潔的方式。
這種簡化的例子可能使它看起來像一個好主意,使模式匹配更普遍的,而不是不同MatchesPatternA
,MatchesPatternB
,MatchesPatternC
等功能。但在我的情況下,模式非常複雜,我還沒有準備好推廣它們。所以我想保留那部分,分開功能。
任何優雅的想法?謝謝!
呃,把'if's改成'else if's並把最後一個位包裝在'else'中?這基本上是你繼續做的。 – Yuushi
嗯,或者你是對的,或者我簡化的例子太簡單了,這使得這裏可行,而不是我真正的問題。讓我找出哪個。 –
好吧,所以我的情況稍微複雜一點(而不是布爾返回值,我有3個可能的返回值),但我仍然認爲你的想法很好。我想我可以把'else if's放在那裏。謝謝! –