2014-05-08 58 views
2

餘米嘗試這種代碼:如何使用具有多個枚舉值的開關?

enum SideType 
{ 
    Vex; 
    Cav; 
    Plano; 
} 

function drawLense(aLeftType:SideType){ 

switch (aLeftType) 
     { 
      case Cav: 
       leftCenter = -aRadius - d * 0.5; 

      case Vex: 
       leftCenter = -Math.cos((-90 + offset) * Math.PI/180) * aRadius-d*0.5; 

      case Plano:return ; 
      case Cav, Vex: 
       points1= drawCurve(1, -90 + offset + trim, 180 - offset * 2 - (trim * 2), leftCenter, aRadius); 
       _LB = points1[0]; 
       _LA = points1[1]; 

     } 
} 

,但我得到一個錯誤,當編譯:

characters 8-16 : This pattern is unused 

所以,它的Cav,VEX指着情況:

我如何檢查的Cav或Vex在上面的情況?

編輯

我發現,如果我刪除的情況下的Cav &案例VEX,然後情況下的Cav,VEX會的工作,但是這不是我想要的,我不能重複使用模式在或experision? like(case Cav || Vex)?

的情況下(CAV || VEX)會導致到:

src/com/optics/components/Lense.hx:343: characters 8-38 : Case expression must be a constant value or a pattern, not an arbitrary expression 

回答

1

簡短的回答:沒有辦法目前,你只能在一個地方匹配一個枚舉選項(不包括看守選項)。因此,爲每個枚舉選項複製代碼並過上幸福的生活(此代碼也將更易於閱讀)或使用秒開關(在某些更復雜的情況下可能更短,更容易)。

-1

嘗試:

case Cav | Vex: 
    trace("cav or vex"); 

希望它能幫助。

4

aLeftType的值只有3個選擇,即Vex,CavPlano

var aLeftType = Vex; 
switch (aLeftType) 
{ 
    case Cav: 
     // If aLeftType is `Cav`, run this line. 
    case Vex: 
     // If aLeftType is `Vex`, run this line. 
    case Plano: 
     // If aLeftType is `Plano`, run this line. 
    case Cav, Vex: 
     // If aLeftType is `Vex` or `Plano`, run this line... 
     // But the first 2 cases already covered `Vex` and `Plano`, 
     // so it will never be reached. 
} 

真的,第四種情況的代碼將永遠不會運行。它類似於:

if (a == 1) { 
    trace("a is 1"); 
} else if (a == 1) { 
    trace("a is really 1"); // This can never be reached. 
} 

這意味着,你必須再想一想你真的想要做什麼。

3

通常,當你想在不同的情況下同樣的事情,你做一個功能:)

function drawLense(aLeftType:SideType){ 

     switch (aLeftType) 
     { 
      case Cav: 
       leftCenter = -aRadius - d * 0.5; 
       functionCalledIfCavOrVex(); 

      case Vex: 
       leftCenter = -Math.cos((-90 + offset) * Math.PI/180) * aRadius-d*0.5; 
       functionCalledIfCavOrVex(); 

      case Plano:return ; 
     } 
} 

function functionCalledIfCavOrVex(/*...*/){ 
     points1= drawCurve(1, -90 + offset + trim, 180 - offset * 2 - (trim * 2), leftCenter, aRadius); 
     _LB = points1[0]; 
     _LA = points1[1]; 
}