56

これは、私がしばらくイライラしてきた質問であり、答えを探すことができませんでした.

しかし、私は少なくとも質問をするかもしれないし、おそらく誰かが説明できると思った.

基本的に、私が取り組んできた多くの言語は、シンタックス シュガーを利用して記述します (C++ の構文を使用):

int main() {
    int a = 2;
    a += 3; // a=a+3
}

一方、lua では+=は定義されていないため、 を記述する必要がありますがa=a+3、これもすべて構文糖衣に関するものです。次のようなより「意味のある」変数名を使用する場合、bleed_damage_over_timeまたは書くのが面倒になり始めるもの:

bleed_damage_over_time = bleed_damage_over_time + added_bleed_damage_over_time 

それ以外の:

bleed_damage_over_time += added_bleed_damage_over_time

したがって、良い解決策がない場合は、これを解決する方法を知りたくありません。その場合、もちろんそれを聞くことに興味があります。むしろ、lua がこの構文糖衣を実装しない理由です。

4

3 に答える 3

17

この質問を次のように書き直すことができると思います

fromがないの<languageX>はなぜですか?<featureY><languageZ>

通常、これは、言語の設計者が、言語の目的と目標に関するビジョンに基づいて行うトレードオフです。

Lua の場合、言語は組み込みスクリプト言語を意図しているため、言語をより複雑にしたり、コンパイラ/ランタイムをわずかに大きくしたり遅くしたりする変更は、この目的に反する可能性があります。

小さな機能をすべて実装すると、「台所のシンク」言語になる可能性があります。ADA、誰かいますか?

そして、あなたが言うように、それは単なる構文糖衣です。

于 2013-11-20T09:32:48.000 に答える
12

Lua に自己代入演算子がないもう 1 つの理由は、テーブル アクセスがメタテーブルでオーバーロードされ、任意の副作用が生じる可能性があることです。自己割り当ての場合、脱糖を選択する必要があります

foo.bar.baz += 2

の中へ

foo.bar.baz = foo.bar.baz + 2

またはに

local tmp = foo.bar
tmp.baz = tmp.baz + 2

最初のバージョンは__indexメタメソッドをfoo2 回実行しますが、2 番目のバージョンは 1 回だけ実行します。言語に自己割り当てを含めず、明示的にすることを強制すると、このあいまいさを回避できます。

于 2014-01-03T16:22:31.543 に答える