2010-12-28 6 views
1

私は数値を含む変数を持っています。 Luaは変数をnilに設定することができますが、その変数はその経路のすべてのコードを破壊して毒性になります。Lua:変数をゼロに設定する方法

変数にnilが含まれている場合は、ゼロに変換します。

local score; 
score = gameResults.finalScore; 

私はscore番号が含まれていることを確認したいので、私は試してみてください。

local score; 
score = tonumber(gameResults.finalScore); 

をしかし、それは動作しません。だから私は試してみる:

local function ToNumberEx(v) 
    if (v == nil) then 
     return 0 
    else 
     return tonumber(v) 
end 

local score; 
score = ToNumberEx(gameResults.finalScore); 

しかし、それは動作しません。だから私は試してみる:

local function ToNumberEx(v) 
    if (v == nil) then 
     return 0 
    else 
     return tonumber(v) 
end 

local score; 
score = ToNumberEx(gameResults.finalScore); 

if (score == nil) then 
    score = 0 
end 

それは機能するが、目的を破る。

機能に問題がありますか?私はプログラミング言語に精通している人以外は、完全に合理的で論理的な説明があると確信しています。

+0

「うまくいきません」という言葉はこれまでにない無駄な苦情です。それは何をしていますか、それがあなたがしたいこととどのように違うのですか? – delnan

+0

"LUAでは変数をnilに設定することができますが、その変数は有毒になり、そのパス内のすべてのコードが破壊されます。多くの場合、タイプミスの検出がより明白になるように、コードの健全性チェックとして機能します。 – jpjacobs

答えて

12
score = tonumber(gameResults.finalScore) or 0 
+0

bam!私はこの種の解決策が大好きです。 – kikito

3

引数は既にこの番号を返しますTONUMBER、その後数や 数に変換、文字列、 であれば、 それ以外の場合は、nilを返します。それは「だった」や「もの」やTONUMBERがテーブルを返すよりも場合は、gameResult.finalScoreを数値に変換することができないときに何が起こるかを考慮していなかった以外

あなたのコードは、良かったですなし。あなたの小切手はそのような状況を検出することができませんでした。

1

実際にこの変数がgameResults.finalScoreにあることを強制したい場合は、Lua metatablesを見てください。

あなたはgameResultsのためのメタテーブルを作成し、メタテーブルの"index""newindex"方法を「上書き」、finalScoreフィールドの値をチェックし、ひいてはそれが所望の範囲になるように、値の強制ができます。

最高の解決策ではありませんが、あなたのケースによっては、他の「悪魔の開発者」に対して良い防御の練習になる可能性があります。 :-)

www.lua.org/pil/13.html(私は現在、1つ以上のリンクを投稿することはできません)PiL 1は、まだLua 5.0を使用している場合や、メタテーブルの概念の深い理解。

関連する問題