2017-07-01 16 views
1

人気のスクリプト言語はLuaベーシックタイプ間で算術演算を有効にするには?

はあなたがLUAで同じことを行うことができます、0以外の任意の数も真である1、falseは0である真この

true*5>10.3*false 

ような表現を可能に?

現在イムラッピングテーブルにすべてのオペランドと有効に__subなどのメタメソッドを使用するには、機能性を述べたが、それは冗長なコードやオーバーヘッド

答えて

1

はいを​​生成します。以下のコードを参照してください。他の算術演算にも同様のメタメソッドを追加できます。

local function b2n(x) 
    if x==false then return 0 end 
    if x==true then return 1 end 
    return x 
end 

debug.setmetatable(false,{ 
    __mul=function(x,y) return b2n(x)*b2n(y) end 
}) 

print(true*5 > 10.3*false) 
+0

残念ながら私の環境ではデバッグテーブルにアクセスできません。私はしかし、それは完全にあなたの答えをマークしたが、それは完全に質問に答える。 – Blob31

0

というアプローチ - LHFで説明したように、「適切な方法」に比べて劣っている間は - 、あなたを助ける現在イムラッピング

ことを考えると、すべてのオペランドのテーブルにと __subのようなメタメソッドを使用する場合があります有効にする機能と、それは冗長なコードやオーバーヘッドを生成

自分の環境でデバッグテーブルにアクセスできません。

...、NBのような値を強制するための機能を持つことである

function N(x) 
    local ty = type(x) 
    if ty == "number" then return x end 
    if ty == "boolean" then return x and 1 or 0 end 
    -- and so on for other types you need to handle 
end 

、その後、あなたはB(v) and (N(x)*N(y) > N(z)+N(w))またはそのような何かを言うと思います。関数呼び出しはまだまだたくさんありますが、テーブル内のすべてをラップするよりも高速です(ラッピングを行う方法と場所によって異なります)。これは読みやすくなります。

ライブラリーのようなコードを書いている場合は、最上位レベル(公開されているライブラリ関数の中で、値を受け取った直後/タイプチェックを行う場所)の強制を実行すると、常にあなたのライブラリーの中に正しいタイプがあり、そこにこれらの強制機能は必要ありません。したがって、基本的には、エントリポイントと通常のコードの後に​​タイプチェック/自動強制が必要になります。

これは、コード内で便宜的に使用している場合(たとえば、比較結果を0または1として算術演算する場合)、折り返しが必要であり、残りの部分が折り返されていないことがわかります。

どちらの場合でも、これはおそらく表の中にあるものをラップするよりも速く、読みやすくなります。

関連する問題