2013-06-22 5 views
5

Насколько вы получаете переменные внутри программы с собой?Lua self ссылки

Как и в Java, у вас есть:

private int a 

public void sa(int a) { this.a = a} 
public void ga() { return this.a } 

VB имеет 'ME' и C# есть 'это' и т.д.

Но, Что в Lua эквивалент этого? Это в правильном направлении?

local a 

function sa(a) 
    self.a = a 
end 
+0

Да , вы ответили на свой вопрос –

+0

Действительно, вэнь я пробовал, он не работал – Snakybo

ответ

1

Это несколько, как вы это говорите, но подход ООП немного отличается. На самом деле это метод.

local t = { 
    a 
} 
t.__index = t 

function t:sa(x) 
    self.a = x 
end 

А затем, чтобы вызвать функцию:

t:sa(21) 

или

t.sa(t, "some string this time?") 
+0

Я вижу, это отлично работает! – Snakybo

+0

Можете ли вы объяснить, что здесь делает __index? –

+0

@ThomasFarley '__index' здесь просто [наследование] (http://www.lua.org/pil/13.4.1.html). – hjpotter92

0

Яростно это то, что я сказал.

local a 

function sa(a) 
    self.a = a 
end 
+0

'local a' не требуется; это не имеет никакого отношения к остальной части кода. –

+2

В этом коде 'self' является глобальной переменной. – lhf

+0

Нет, это совершенно другое. 1) локальный a бесполезен, используемая внутренняя функция - это тот, который получен как параметр, и скрыть другой 2) self - это глобальный И не имеет назначенного значения, поэтому он равен нулю 3) Если вы используете строку, которая вызывает sa, например sa («test»), вы получите ошибку времени выполнения: «попытайтесь проиндексировать глобальное« я »(значение nil)» – Alar

9

В Lua, вы не имеете конкретную реализацию класса, но вы можете использовать таблицу для его имитации. Чтобы сделать вещи проще, Lua дает некоторый "синтаксический сахар":

Объявить членом класса, вы можете использовать это полный эквивалент syntazes

function table.member(self,p1,p2) 
    end 

или

function table:member(p1,p2) 
    end 

или

table.member = function(self,p1,p2) 
    end 

Теперь наступает сложная часть:

Вызов

table:member(1,2) 

вы получите:

self=table,p1=1,p2=2

вызова

table.member(1,2) 

вы получите:

self=1,p1=2,p2=nil

Другими словами, : имитирует настоящий класс, а . больше напоминает статическое использование. Хорошая вещь вы можете смешать эти 2 типа, так, например:

table.member(othertable,1,2) 

дает

self=othertable,p1=1,p2=2

Таким образом, вы можете «одолжить» метод от других классов реализации множественного наследования