17

クラスに問題があります。以下のエラーが発生しました: Attempt to index local 'self' (a nil value) 以下のクラスの getter メソッドを呼び出すと。Item.lua ファイル:

require "classlib"
Item = class("Item")

function Item:__init()
    self.interval = 1
end

function Item:getInterval()
    return self.interval
end

このゲッター関数を次のように呼び出しています。

dofile("../src/item.lua")

item = Item()

function test_item()
    assert_equal(1, item.getInterval())
end

ここで何が問題なのですか?

敬具...

4

3 に答える 3

36

一般に、メンバー関数は で呼び出す必要があります:

Lua では、コロン ( :) は関数の呼び出しを表し、self最初のパラメーターとして提供されます。

したがって

A:foo()

にほぼ等しい

A.foo(A)

A を のように指定しない場合A.foo()、関数の本体は、self明示的にも暗黙的にも入力されていないパラメーターを参照しようとします。

メンバー関数から呼び出すと、selfすでに利用可能になることに注意してください。

-- inside foo()
-- these two are analogous
self:bar()
self.bar(self)

この情報はすべて、優れた Lua の本やチュートリアルに記載されています。

于 2012-12-28T12:46:37.877 に答える
1

obj:methodは、次の構文上の砂糖です。

意味:

関数obj:method(alpha)はobj.method(self、alpha)と同等です

実行:

obj:method( "somevalue")はobj.method(obj、 "somevalue")と同等ですよろしく

于 2012-12-29T09:42:30.703 に答える
-1

変化する:

assert_equal(1, item.getInterval())

に:

assert_equal(1, item:getInterval())

Lua では、エラー報告がばかげていました。クラスの観点からは、メソッドはパラメーターを使用.getInterval()して呼び出す必要がありますが、メソッドには暗黙的にパラメーターが含まれています。また、構文エラーは、の定義本体ではなく、呼び出されたポイントでラベル付けする必要があります。self:getInterval()selfgetInterval()

従来、メソッドの呼び出しを誤ったとしても、それはメソッドのせいではなく、呼び出し元が原因でした。

于 2013-03-31T17:07:10.483 に答える