2017-10-25 11 views
2

ここに行く...ルア - "self"を使用した場合と使用しなかった場合の同じ結果

パラメータで "self"という関数を宣言するさまざまな例を試しています。

私は完全に理解しようとしているこれを完全に理解していません。私は完全な初心者ですが、私はこれを完全に把握しなければなりません。

例2では、​​関数内で "self = {}"を宣言しなければ、 "self"(または ":")をそれが機能するための関数パラメータが含まれています。これは "自己"との取引ですか?

「self」を使用すると、他の意味がありますか?

例1つの

function Character.new(x) 

    self = {} 

    self.name = x 

    return self.name 

end 



a = Character 

b = Character 

hobbit = a.new ("Frodo") 

dragon = b.new ("Smaug") 



print (hobbit) 

print (dragon) 

例2

Character = {} 

function Character:new(x) 

    self.name = x 

    return self.name 

end 



a = Character 

b = Character 

hobbit = a:new ("Frodo") 

dragon = b:new ("Smaug") 



print (hobbit) 

print (dragon) 

; ^) Zalokin

+2

'self'は、': '表記法でメソッドを定義するときに表示される暗黙的な最初のパラメータです。キーワードではないので、常に明示的に宣言することができます。 – luther

答えて

1

:はあなたが明示的に(最初の引数なしの関数の中から機能を含んでいるテーブルにアクセスすることができます) パス。関数の定義と呼び出しの両方に使用できます。

以下の例には、テーブルtが含まれています。テーブルには、3つの関数(a,bおよびc)と、キーgreetingの下に文字列のエントリがあります。

すべての関数/メソッド呼び出しは、同じ文字列 "hello user"を出力します。

通常の関数と同じ方法でメソッド(コンテナテーブルを最初の引数として持つ関数)を呼び出すことはできますが、そのテーブルを最初の引数として明示的に渡す必要があります。

引数は任意の名前で呼び出すことができますが、関数内で正しい引数名を使用している場合は:の関数を呼び出すことができます(この場合はselfではありません)。関数cがその一例です。

基本的に構文砂糖です。

local t = {} 

t.greeting = "hello" 

function t:a(name) 
    print(self.greeting, name) 
end 

function t.b(self, name) 
    print(self.greeting, name) 
end 

function t.c(myself, name) 
    print(myself.greeting, name) 
end 

t.a(t, "user") 

t:a("user") 

t.b(t, "user") 

t:b("user") 

t.c(t, "user") 

t:c("user") 
+0

私は最終的にすべてを理解し始めている。 – Zalokin

+1

これは私の思考プロセスなので、私には気をつけてください...関数が呼び出されたとき、tはオブジェクトtを指しています。オブジェクトは関数パラメータ "self"(または何でも)で与えられ、オブジェクト自体を指します。関数が出力するとき、オブジェクトtを考慮して挨拶の下にフィールドを印刷します... – Zalokin

+0

私はもっと簡単な例を考えました - 't = {} t.greeting =" hello " function ta 、名前) プリント(z.greeting、名) 端 A1 = T A2 = T A3 = T A1:( "ユーザ1") A2:( "ユーザ2 ") a3:a(" user 3 ")' – Zalokin

2

あなたがインスタンスを作成する必要があるときは、グローバル変数を使用しています。

ではなく、これらの行を試してみてください、彼らはあなたが理解するのに役立つことがあります。

-- example 1 
print (hobbit) 
print(self.name) 
print (dragon) 
print(self.name) 

-- example 2 
print (hobbit) 
print(Character.name) 
print (dragon) 
print(Character.name) 
+0

これは魅力的で魅力的です!関数の変数に例1のself.nameを使用すると、プログラムが動作します。しかし、例2ではそうではありません( 'print(self.name)'で止まります)。関数内の変数として 'name'を使用すると、両方の例が機能します(つまり、': 'または' .')。今私はさらに混乱している – Zalokin

関連する問題