2014-06-13 5 views
0

haxe로 작성된 기존 플래시 앱을 openfl 및 haxe를 사용하여 javascript로 컴파일하려고합니다.haxe 초기화되지 않은 멤버 변수가 플랫폼간에 일치하지 않습니다

플래시에서 나는 다음과 같은 작업을 수행 할 수 있습니다

class foo 
{ 
    var bar : Int; 

    public function new() 
    { 
     trace(bar); //under flash prints 0, under javascript undefined 
    } 
} 

0 대신 자바 스크립트로 컴파일, 내가 정의되지 않은 얻을.

제 질문은 생성자가 초기화되지 않은 채로 멤버 변수를 남겨두면 컴파일 인쇄 경고/오류를 만들 수 있습니다.

더 나은 내가 내가 그렇게 haxe = 0 등, 내가 테스트를하지만, 아마도 객체하지 않은 플로트, 부울 = 거짓과 0

같은 이야기 JS 나를 위해 그들을 초기화 할 수 있도록 haxe 할 수 있습니다 = null도.

앱에는 144 개의 클래스와 20k 줄 이상의 코드가 있습니다. 명시 적 초기화 도구를 수동으로 찾아서 추가하는 데 시간이 오래 걸릴 수 있습니다. 그래서 나는 대안을 찾고 있습니다.

+3

이것은 문서화 된 동작입니다 : http://haxe.org/manual/types-nullability.html - 기본적으로 "동적"플랫폼 (JS, Neko, PHP, Python)에서 기본값은 항상 null입니다. @ 니코의 대답은 정확했습니다. 선언 할 때 0으로 초기화하면 안전 할 것입니다. –

답변

0

야해. 나는 sed와 정규식을 사용하여 소스 트리에서 초기화되지 않은 모든 변수를 찾아서 대체함으로써이 문제를 해결했다.

소스 트리의 루트에서 우분투에서 다음 명령을 실행했습니다. UInt에 대한 유사

var [variableName] : Int = 0; 

, Bool, Float

var [variableName] : Int; 

를 대체 할

find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Int\s*\);/\1 = 0;/g" 
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*UInt\s*\);/\1 = 0;/g" 
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Bool\s*\);/\1 = false;/g" 
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Float\s*\);/\1 = 0;/g" 
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*[^=]\+\s*\);/\1 = null;/g" 

. 다른 모든 유형은 null로 설정됩니다.

에 대해서는 소스 트리에 인스턴스가 4 개 밖에 없었기 때문에이 글을 쓰지 않았습니다.

4

왜 그냥 해달라고 : 당신은 (나는에 실행 한) 정말 중요한 특정 상황이 없다면 var bar:Int = 0; 그것이 큰 문제 : 다른 어떤 사람이 질문을 가지고 경우

+0

기존의 haxe 소스는 144 개의 클래스와 26k 라인의 코드를 가지고 있습니다. 나는 = 0, 또는 = false가 필요한 모든 장소를 수동으로 찾는 것을 피하고 싶습니다. – tesract

0

이전에 언급했듯이이 내용은 haxe.org/manual/types-nullability.html입니다. 그 이유는 간단합니다.

하지만 몇 가지 유의해야 할 점이 있습니다.

자바 스크립트에서는 속도를 느슨하게하거나 파일 크기를 약간 늘리지 않고도 문제를 해결할 수 있습니다. 실제로 코드를 더 빠르게 실행합니다. 객체 프로토 타입에 기본값을 설정하여이를 수행 할 수 있습니다. 객체 프로토 타입은 사용자 정의 js 생성기 기능을 사용하여 간단하게 수행 할 수 있습니다.

다른 플랫폼의 경우에는 그러한 방법이 없습니다. 따라서 유일한 대안은 동적 초기화입니다. 그러나 두려워하지 마라! 매크로가 있습니다. 초기화되지 않은 값에 대해 알려주는 매크로를 작성하는 것은 매우 쉽습니다. 또한 매크로를 초기화하여 매크로를 작성하는 것이 매우 쉽습니다.

솔직히 말해서 나는 거기에 많은 문제를 보지 못했지만 어쩌면 당신은 그것을 과대 평가하고 있습니까? 나는 수년간 haxe와 매일 같이 일하고 있으며, 나는 결코 심각한 문제에 빠지지 않았습니다.대부분의 경우 동적으로 초기화 작업을 수행하므로 전혀 문제가되지 않으며, 그렇지 않은 경우에는 일반적으로 5 초 정도 걸립니다. 물론 IMHO.

+0

모든 것을 초기화하기 위해 sed 명령을 실행 했으므로 많은 문제가 수정되었습니다. 플래시 응용 프로그램은 변수의 자동 초기화에 의존하도록 코딩되었으므로 자바 스크립트에서 많은 미묘한 버그가 발생했습니다. 그것들은 모두 없어졌고 이제는 openfl과 같은 것들을 수정하는 데 초점을 맞출 수 있습니다. flash.display.drawRoundRect를 구현하지 않았습니다. – tesract