Разница между . и: в Lua
29618 просмотра
3 ответа
Я запутался в разнице между вызовами функций через .
и через:
> x = {foo = function(a,b) return a end, bar = function(a,b) return b end, }
> return x.foo(3,4)
3
> return x.bar(3,4)
4
> return x:foo(3,4)
table: 0x10a120
> return x:bar(3,4)
3
Что :
делает?
Ответы (3)
219 плюса
Двоеточие предназначено для реализации методов, которые передаются self
в качестве первого параметра. Так x:bar(3,4)
должно быть так же, как x.bar(x,3,4)
.
25 плюса
Для определения это в точности то же самое, что и указание себя вручную - при компиляции он даже выдаст тот же байт-код. Т.е. function object:method(arg1, arg2)
такой же как и function object.method(self, arg1, arg2)
.
При использовании :
это почти то же самое, что .
- внутренний вызов будет использоваться особый вид, чтобы убедиться, что object
любые возможные побочные эффекты расчетов / доступа рассчитываются только один раз. Вызов object:method(arg1, arg2)
в остальном такой же как object.method(object, arg1, arg2)
.
18 плюса
Чтобы быть полностью точным, так obj:method(1, 2, 3)
же, как
do
local _obj = obj
_obj.method(_obj, 1, 2, 3)
end
Почему локальная переменная? Потому что, как отмечали многие, obj:method()
только индексы _ENV
можно получить один раз obj
. Обычно это просто важно при рассмотрении скорости, но рассмотрим следующую ситуацию:
local tab do
local obj_local = { method = function(self, n) print n end }
tab = setmetatable({}, {__index = function(idx)
print "Accessing "..idx
if idx=="obj" then return obj_local end
end})
end
tab.obj.method(tab.obj, 20)
--> Accessing obj
--> Accessing obj
--> 20
tab.obj:method(10)
--> Accessing obj
--> 10
Теперь представьте, что __index
метаметод сделал больше, чем просто напечатал что-то. Представьте, что он увеличил счетчик, записал что-то в файл или удалил случайного пользователя из вашей базы данных. Есть большая разница между этим дважды или только один раз. В этом случае есть четкая разница между obj.method(obj, etc)
и obj:method(etc)
.
Вопросы из категории :
- function Как вы передаете функцию в качестве параметра в C?
- function Как работают закрытия JavaScript?
- function Есть ли в Python функция для разбиения слова на список?
- function Что предпочтительнее использовать в Python: лямбда-функции или вложенные функции ('def')?
- function Есть ли лучший способ сделать необязательные параметры функции в JavaScript?
- function В чем разница между «закрытием» и «лямбдой»?
- function Лучшие практики: многие мелкие функции / методы или более крупные функции с встроенными логическими компонентами процесса?
- function Как получить имя функции в виде строки в Python?
- function strdup () - что он делает в C?
- function Why can I use a function before it's defined in JavaScript?
- lua тонкие различия между JavaScript и Lua
- lua Самый эффективный способ определить, является ли таблица Lua пустой (не содержит записей)?
- lua Lua против PHP / Python / JSP / и т. Д.
- lua Concatenation of tables in Lua
- lua Разделить строку в Lua?
- lua Как проверить, содержит ли таблица элемент в Lua?
- lua Используя Lua, проверьте, является ли файл каталогом
- lua Выберите случайный элемент из таблицы
- lua Можно ли заставить индексирование таблицы Lua с нуля?
- lua Inheritance for metamethods in Lua