2014-07-14 2 views
0

Haxe에 이름이 같은 블록이 있습니까 (Action Script 3 에서처럼)? 'named block'이 올바른 용어인지는 알 수 없습니다. Haxe는 블록 또는 이와 유사한 이름을 지었습니까?

은 (점을 강조하기 위해 기본 예제) 다음의 예를 감안할 때 : 충돌이 발생

singleCollision: { 
      for (teleport in teleports) { 
       if (overlap(player, teleport)) { 
        onTeleport(player, teleport); 
        break singleCollision; 
       } 
      } 

      for (chest in chests) { 
       if (overlap(player, chest)) { 
        onChest(player, chest); 
        break singleCollision; 
       } 
      } 

      for (shop in shops) { 
       if (overlap(player, shop)) { 
        onShop(player, shop); 
        break singleCollision; 
       } 
      } 
    } 

경우, 블록을 깨고 계속합니다. 인라인 함수 등의 대안이 있지만 Haxe가 비슷한 것을 지원하는지 더 궁금하다.

좋은 예는 여기있다 : 그것은 일반적으로 코드 레이블 또는 GOTO 레이블이라고 http://jacksondunstan.com/articles/1228

답변

0

.

아니요, 그렇습니다. (일부는 백엔드 임)

스파이 거 코드는 오랫동안 나쁜 습관으로 간주됩니다. 조건부 루프를 사용하면 훨씬 더 명확 해집니다.

+0

동의하는 동안은, 특히 화살표 코드를 병합 할 때, 장소가 http://blog.codinghorror.com/flattening-을 화살표 코드 /. 이 경우 조건부 루프가 얼마나 잘 작동하는지 모릅니다. 오른쪽 화살표 만 더 움직일 것입니다. – Chris

+0

@Chris 그러나이 기사에는 코드 레이블에 대한 내용이 없습니다. 그리고 나는 그들을 사용하는 것이 순수한 GOTO 지옥에 가지 않고도 문제를 해결할 수 있을지 의심 스럽다. 실제로, 그러한 경우의 대부분은 내 경험에 대한 영리한 생각만으로 고칠 수 있습니다. 그리고 yhou에 정말 중첩이 필요한 경우 몇 군데가 있습니다. 왜 그렇지 않습니까? 정말로 필요합니다. 코드 뒤에있는 작업은 코드를 약간 더 복잡하게 만드는 것을 정당화 할 정도로 복잡 할 것입니다. Offtopic tho ... – stroncium

-1

당신이 시도 - 캐치를 사용하는 경우, 당신은 codebreak 위치 감지 할 수 있습니다 :

try { 
     for (teleport in teleports) { 
      if (overlap(player, teleport)) { 
       onTeleport(player, teleport); 
       throw 0; 
      } 
     } 

     for (chest in chests) { 
      if (overlap(player, chest)) { 
       onChest(player, chest); 
       throw 1; 
      } 
     } 

     for (shop in shops) { 
      if (overlap(player, shop)) { 
       onShop(player, shop); 
       throw 2; 
      } 
     } 
} 
catch(e:Dynamic) 
{ 
     switch (e) { 
      ... 
     } 
} 
+0

흐름 제어에 대한 예외 사용은 나쁜 습관으로 간주되어야합니다. http://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control –

+0

확신하지 못한다. Neko 플랫폼의 try-catch 블록에서 여러 개의 오래 지속되는 루프가있는 코드를 테스트 한 결과 성능은 변하지 않았습니다. 나는 try-catch 내부의 루프가 큰 차이를 만들지 않으면 서 try-catch 블록을 루프 내에 두는 것은 나쁜 생각이라고 말한다. 던지기는 다음과 같습니다. (잘못된 것이면 올바르게 수정하십시오.) 1. 스택을 catch 블록에 배치 2. 이전 레지스터 복구 3. 생성 된 객체 전달 (새 생성 대신 정적 객체로 최적화 할 수 있음) 저에게 묻는다면, 일부 가상 머신의 성능이 떨어지는 실제 이유가 없습니다. – Vox

+0

하지만 요점은 아닙니다. throw 대신 return을 만드는 함수를 사용하여 동일한 작업을 수행 할 수 있습니다. 그러나 컴파일러가 힙에서 그러한 함수에 사용 된 모든 외부 변수의 사본을 만들 로컬 함수를 만들기로 결정하면 그러한 함수를 인라인하는 것은 나쁜 생각 일 수 있습니다. – Vox

관련 문제