1

Luaで継承のあるクラスを実装しようとしています。さらに、新しいオブジェクトを作成するときは、ある種の「型チェック」が必要です。

特定の要件の 1 つは、クラスを作成するために特定の構文を使用することです (例)。

Class({Volkswagen, Vehicle, model=String, speed=Number, driving=Boolean})

パラメータは可変長のリストとして渡されることに注意してください。したがって、任意の数の引数を取得する関数が必要です。

function Class (arguments)
    name = arguments[1]
    superclass = arguments[2]
    ...
end

最初の 2 つの引数は、クラスの名前と継承元のクラスの名前です。

解決策は簡単だと思いますが、属性のキーと値のペアを処理する方法がまったくわかりません。たとえば...

print(arguments.model)
print(type(arguments.model))

...どちらもゼロです。属性のタイプ (文字列、ブール値、数値) を取得する方法はありますか?

4

3 に答える 3

3

この行:

{Volkswagen, Vehicle, model=String, speed=Number, driving=Boolean}

あなたがそれが意味すると思うことを意味しません。それは価値観です。

その場合{Volkswagen}、Lua に現在グローバル テーブルに格納されている文字列 name の値を取得するように指示しています"Volkswagen"。そこに何らかの値が格納されていると仮定します。

あなたの問題は、{model=String}現在グローバルテーブルに格納されている値を文字列名の下にテーブルに入れていることです"String"。という名前のグローバル変数がない可能性は高いです"String"。つまりnil、テーブルに入れます。

LuaJava が定義しない限り、「属性」 (文字列、ブール値、数値) は存在しません。それらは単なる空の値です。空の値を渡すことはできません。stringを渡すことができますが、それは異なります。

あなたのこの機能が正確に何Classをすべきかをうまく説明していないので、あなたがより良くしようとしていることをどのように行うかについてのヒントを与えることはできません.

于 2012-04-29T12:52:34.113 に答える
0

キーと値のペアを処理するには、組み込みのテーブル関数を使用して、参照されるテーブルをローカルテーブルに転送する必要がある場合があります。

function Class(params)
local arguments={}

function transfer(k, v)
  arguments[k]=v
end

--transfer referenced table to local table
table.foreach (params, transfer)

print(arguments[1])
print(arguments[2])
print(arguments.model)
print(arguments.speed)
print(arguments.driving)

終わり

Class({"Volkswagen"、 "Vehicle"、model = ""、speed = 0、driving = false})

于 2012-04-29T16:15:03.270 に答える
0

汎用の Lua クラス システムを探しているだけなら、私の実装は次のとおりです: https://gist.github.com/1722329

型チェックはサポートしていませんが、厳密に型指定されたすべてのクラスのベースとして機能する「TypedClass」クラスを使用して簡単に実装する必要があります。

于 2012-04-29T14:56:35.940 に答える