5

このビデオで見つけたクラスの例を変更して、もう少し効率的に使用できるようにしようとしています。私のコメントが、私が達成しようとしていることを十分に説明してくれることを願っています。私が抱えている問題は、データ テーブルを使用しようとすると、次のエラーが表示されることです: lua: class example.lua:7:

これは、配列が関数に適切に渡されていないことを意味していると思いますが、その理由はわかりません。私はLuaの初心者です。

これが私が持っているものです:

local enemy = {}; --enemy class table

function enemy:New(data)
  local object = {}; --table to store all of data within class
  local len = # data --get length of passed table
  for i = 1, len, 2 do --loop to input all data from passed table into object table
    object.data[i] = data[i + 1];
  end

  function object:getData(choice) --function that allows us to retrieve data from the class
    return self[choice];
  end

  return object; --return class data table so we can create objects using the class
end

local monsterdata = {"name", "monster", "x", 64, "y", 128, "hp", 4}; --table containing data of monster. keys are odd numbered, values to those keys are even numbered
local monster = enemy:New(monsterdata); --create a object using the class

local test = monster:getData("x"); --set variable to a value with the getData function

print(test);
4

3 に答える 3

5

テーブルを作成していませんobject.data。Lua の各テーブルを初期化する必要があります。

local object = {}
local object.data = {}

また

local object = { data = {} }

ただし、 getData 関数を修正しない限り、例は意図したとおりに機能しません。

function object:getData(choice) 
  return self.data[choice]
end

;最後に、これは Lua なので、コードには何も必要ありません:P.

于 2013-01-02T08:46:23.410 に答える
4

データを保持したい場合はobject、おそらく次のように書くつもりでした

object[data[i]] = data[i + 1];

それ以外の

object.data[i] = data[i + 1];

これを行うと、出力される結果は64.

于 2013-01-02T15:38:05.927 に答える
2

他の人が言ったように、object.data初期化する必要があり、forループとに欠陥がありますgetData。また、正確にはバグではありませんが、キーを奇数として、値を偶数として渡すシステムは、連想配列/辞書/テーブル リテラルを使用せずに C ベースの言語でそれを行うための非常に良い方法ですが、Lua では、イディオムは

{keyname = value, keyname = value, ...}

また、テーブルが複数行にまたがる場合

{
    keyname = value;
    keyname = value;
    keyname = value;
    ...
}

したがって、あなたの場合、monsterdata単に

{
    name = "monster";
    x = 64;
    y = 128;
    hp = 4;
}

forループを完全に削除できます

注: この方法では文字列キーのみを表すことができます。数値、ブール値、または関数やその他のテーブルなど、他の種類のキーについては、キーを[角括弧で囲みます]。たとえば、mynotテーブルが必要な場合、ブール値を反対の値にマップするには、次を使用できます。

{
    [true] = false;
    [false] = true;
}

または、一連の関数をそれらのライブラリにマップしたい場合

{
    [print] = "standard";
    [os.execute] = "standard os";
    [math.sin] = "standard math";
    [function() print "a user function" end] = "me!";
}

Lua について学べば学ぶほど、Lua が好きになると思います。それは本当に素晴らしい言語で、楽しい小さな機能がたくさんあります。ハッピーコーディング!

于 2013-01-02T20:31:52.803 に答える