2014-06-13 41 views
0

我想交叉編譯使用openfl和haxe編寫的haxe到JavaScript的現有的Flash應用程序。haxe未初始化的成員變量跨平臺不一致

在閃光,我可以做到以下幾點:

class foo 
{ 
    var bar : Int; 

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

當編譯爲JavaScript,而不是0,我得到了一個未定義。

我的問題是我可以讓編譯打印警告/錯誤,如果一個成員變量留下的構造函數初始化。

更妙的是我可以讓haXe的我做起來很haXe的將JS初始化它們對我來說,0

與布爾= FALSE同樣的故事,浮= 0等,我沒有測試過,但可能與對象=也是null。

該應用程序有144個類,超過20萬行代碼。手動查找和添加顯式初始化器需要大量的時間,這就是爲什麼我正在尋找替代品。

+3

這是記錄的行爲:http://haxe.org/manual/types-nullability.html - 基本上在「動態」平臺(JS,Neko,PHP,Python)上,默認值將始終爲空。 @ Nico的回答是正確的 - 當你聲明它時將它初始化爲零,並且你將會安全。 –

回答

0

在某些情況下,一個人有這個問題。我通過使用sed和正則表達式來查找並替換源代碼樹中所有未初始化的變量來解決此問題。

從源碼樹的根目錄下,我在ubuntu下運行了以下命令。

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" 

將與

var [variableName] : Int = 0; 

類似的UIntBoolFloat更換

var [variableName] : Int; 

。所有其他類型都設置爲空。

我沒有寫一個var [varName];因爲在我的源代碼樹中只有4個是實例。

4

你爲什麼不只是做:var bar:Int = 0;除非你有一個特定的情況下它真的很重要(我遇到了),它不應該是一個大問題:)

+0

現有的haxe源代碼有144個類,超過26000行代碼。我非常想避免找到每個需要an = 0或an = false的地方。 – tesract

0

由於這是前面提到的,這是記載:haxe.org/manual/types-nullability.html。原因很簡單:速度。

但有幾件事要注意。

在JavaScript中,您可以解決這個問題,而不會放慢速度並略微增加文件大小。它甚至使代碼實際上運行得更快。您可以通過將默認值設置爲對象原型來實現這一點,這反過來可以通過使用自定義js生成器功能完成。

對於其他平臺,有沒有這樣的方式,我想,這樣訴諸的唯一事情是動態初始化。但不要害怕!宏在這裏爲你。編寫一個宏可以很容易地通知你有關未初始化的值,而且也很容易編寫宏來爲你初始化它們。

但是誠實的說,我看不出太大的問題出現,也許你高估了嗎?我與哈克斯一起工作多年,每天都有,我從來沒有遇到任何嚴重的問題。大多數情況下,由於您通常會動態地初始化事物,所以根本不會打擾您,而在您不這樣做的情況下,通常需要5秒才能解決問題。當然,恕我直言。

+0

因爲我已經運行了sed命令來初始化所有問題都已修復。 Flash應用程序被編碼爲依賴於變量的自動初始化,所以在JavaScript中導致了許多微妙的錯誤。這些都沒有了,現在我可以專注於修復openfl沒有實現flash.display.drawRoundRect的事情。 – tesract