Перейти к содержимому


Фотография

Метатаблицы, Lua

lua meta metatable setmetatable getmetatable OOP ООП

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 20

#1 Оффлайн   Ktlo

Ktlo
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                    

Отправлено 24 Август 2015 - 12:38

*
Популярное сообщение!

Метатаблицы — это самые обыкновенные таблицы, содержащие функции, которые изменяют стандартное поведение операторов в Lua. Метатаблица в Lua может быть у любого значения, но только у каждой таблицы может быть своя метатаблица, у всех остальных же одна на всех. Так например у типа значения строки есть своя встроенная метатаблица, которая позволяет нам делать так: ("строка"):rep(10) В данной таблице присутствует поле __index. А у потоков метатаблицы нет, а надо бы!!! Но обо всём по порядку.

Для установки и получения метатаблиц в Lua по стандарту существует 4 функции:

  • setmetatable(table: table, metatable: table):table — это основная функция, которая позволяет установить таблице метатаблицу. Такая функция работает только с таблицами.
  • getmetatable(value: value):table or value  возвращает метатаблицу, если есть или значение поля __metatable в метатаблице, если есть. Работает со всеми значениями.
  • debug.setmetatable(value: value):boolean or table — устанавливает метатаблицу любому значению и обходит метаполе __metatable. Действительно мощная штука, вот почему её убрали в Open Computers :giggle:.
  • debug.getmetatable(value: value):table or value — возвращает метатаблицу, обходя поле __metatable.​ Также отсутствует в OC.

Теперь, я думаю, можно приступить к самим метаметодам. Для своего, а может быть и вашего удобства я их разделю на четыре категории:

Разное

Спойлер
 
Математические
Спойлер
 

Сравнение

Спойлер

 

Битовые операторы
Спойлер

Сообщение отредактировал Ktlo: 28 Март 2016 - 17:57


#2 Оффлайн   Ktlo

Ktlo
  • Автор темы
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                    

Отправлено 25 Август 2015 - 18:19

Обновил и добавил про математические метаметоды.


  • vx13 это нравится

#3 Оффлайн   swg2you

swg2you
  • Пользователи
  • Сообщений: 268
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

              

Отправлено 26 Август 2015 - 07:47

Немного странный результат у последнего примера, правда?   Попробуйте это объяснить.

--Если первый аргумент - таблица, то присваиваем ему значение 42, иначе его изначальное значение
 

Шутишь?

---

Ме-та-та-бли-бли-бли-цы - уж-жасное название. Еще ужаснее конструкции вида:

 при работе с метатаблицами, она устанавливает таблице метатаблицу. Первый аргумент здесь — таблица, второй — метатаблица

 

Прочитал, теперь заикаюсь.

 

Материал хорош, и грамотен, но та-та-та-блицы с ме-ме-ме-та-методами нужно подавать проще и другими словами.



#4 Оффлайн   davial

davial
  • Пользователи
  • Сообщений: 454
  • Уровень сигнала: 14,24%
  • В игре: 122 час. 17 мин.
  • ГородТроон в системе Канопуса.

Награды

                       

Отправлено 26 Август 2015 - 12:02

 

Шутишь?

---

Ме-та-та-бли-бли-бли-цы - уж-жасное название. Еще ужаснее конструкции вида:

 

 

 

Прочитал, теперь заикаюсь.

 

Материал хорош, и грамотен, но та-та-та-блицы с ме-ме-ме-та-методами нужно подавать проще и другими словами.

 

Оно вроде как и .. ты прав ... но ... из песни слов не выкинешь. Чем думаешь заменить валийское  metatable.Каким словом из русского языка? Чтобы звучало - просто, понятно и правильно.


Сообщение отредактировал davial: 26 Август 2015 - 12:03


#5 Оффлайн   LeshaInc

LeshaInc
  • Пользователи
  • Сообщений: 1 213
  • Уровень сигнала: 13,71%
  • В игре: 117 час. 41 мин.
  • ГородЛуна

Награды

                       

Отправлено 26 Август 2015 - 13:23

Оно вроде как и .. ты прав ... но ... из песни слов не выкинешь. Чем думаешь заменить валийское  metatable.Каким словом из русского языка? Чтобы звучало - просто, понятно и правильно.

о-себе-таблица)))

#6 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 750
  • Уровень сигнала: 0,26%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 26 Август 2015 - 14:02

Да, термин "таблица" рябит в глазах, особенно если это замечаешь.

 

Однако, на мой взгляд, в статье на подобную тему это неизбежно. И уж тем более не стоит заменять термин "метатаблица" на неологизм собственного сочинения, вводя в заблуждение читающих статью новичков.

 

  • setmetatable(tabletable) — эта основная функция при работе с метатаблицами, она устанавливает таблице метатаблицу. Первый аргумент здесь  таблица, второй  метатаблица. Такая функция работает только с таблицами.

 

Можно использовать синтаксис описания команд, подобный тому, что можно увидеть на http://ocdoc.cil.li/

И переформулировать фразы немного, чтобы избежать излишней тавтологии.

 

  • setmetatable(table: table, metatable: table) — это основная функция, которая позволяет установить таблице метатаблицу.

 

Т.е. тип аргументов и какой идет куда, становится понятно из сигнатуры.


Сообщение отредактировал Totoro: 26 Август 2015 - 14:03


#7 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 26 Август 2015 - 14:20

Наверное следует упомянуть, что __index и __newindex могут быть не только методами, но и таблицами. На счет остальных заклинаний не уверен.



#8 Оффлайн   Ktlo

Ktlo
  • Автор темы
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                    

Отправлено 26 Август 2015 - 15:51

Наверное следует упомянуть, что __index и __newindex могут быть не только методами, но и таблицами. На счет остальных заклинаний не уверен.

Но я упоминал об этом.


Да, термин "таблица" рябит в глазах, особенно если это замечаешь.

 

Однако, на мой взгляд, в статье на подобную тему это неизбежно. И уж тем более не стоит заменять термин "метатаблица" на неологизм собственного сочинения, вводя в заблуждение читающих статью новичков.

 

 

Можно использовать синтаксис описания команд, подобный тому, что можно увидеть на http://ocdoc.cil.li/

И переформулировать фразы немного, чтобы избежать излишней тавтологии.

 

 

Т.е. тип аргументов и какой идет куда, становится понятно из сигнатуры.

Переделаю, так действительно будет лучше.


  • Zer0Galaxy, Fingercomp и Mecopy6ka это нравится

#9 Оффлайн   swg2you

swg2you
  • Пользователи
  • Сообщений: 268
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

              

Отправлено 27 Август 2015 - 13:08

Однако, на мой взгляд, в статье на подобную тему это неизбежно. И уж тем более не стоит заменять термин "метатаблица" на неологизм собственного сочинения, вводя в заблуждение читающих статью новичков.

 

Тут как раз "метатаблица" и есть неблагозвучный калькированный с английского неологизм.

 

Если бы документацию писали, а не переводили, то термин скорее всего был бы "суб-таблица" или составной, но более точный по сути "таблица операторов". А в случае с __index и __newindex было бы оговорено, что в качестве таблицы операторных методов может выступать обычная таблица индексов-значений.

 

ЗЫ

"метаметод" - тоже, еще та корявость ) мета-метод это как?


Сообщение отредактировал swg2you: 27 Август 2015 - 13:12


#10 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 750
  • Уровень сигнала: 0,26%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 27 Август 2015 - 19:34

Тут как раз "метатаблица" и есть неблагозвучный калькированный с английского неологизм.

 

Если бы документацию писали, а не переводили, то термин скорее всего был бы "суб-таблица" или составной, но более точный по сути "таблица операторов". 

 

Немного не соглашусь.

У неологизма "метатаблица" есть как минимум пара преимуществ, по сравнению с другими вариантами.

Первое - он широко распространен (в контексте Луа). Как в английском так и в русском языке.

Второе - это наиболее точный перевод термина "metatable" на русский. То что перевод так похож на оригинал - лишь облегчает понимание мануалов.

Так что тут уже все решено за нас создателями языка.

 

Термин "суб-таблица" возможно прижился бы. Но он звучит менее определенно. "Под-таблица". Это таблица-элемент? Таблица операторов? Или что-то еще?

Приставка "мета-" носит в русском языке (хотя она несомненно иностранного происхождения) смысл абстрактности и обобщенности. Что вполне подходит к случаю, на мой взгляд.


  • Fingercomp и cloud это нравится

#11 Оффлайн   swg2you

swg2you
  • Пользователи
  • Сообщений: 268
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

              

Отправлено 27 Август 2015 - 20:07

Немного не соглашусь.

У неологизма "метатаблица" есть как минимум пара преимуществ, по сравнению с другими вариантами.

Первое - он широко распространен (в контексте Луа). Как в английском так и в русском языке.

Второе - это наиболее точный перевод термина "metatable" на русский. То что перевод так похож на оригинал - лишь облегчает понимание мануалов.

Так что тут уже все решено за нас создателями языка.

 

Термин "суб-таблица" возможно прижился бы. Но он звучит менее определенно. "Под-таблица". Это таблица-элемент? Таблица операторов? Или что-то еще?

Приставка "мета-" носит в русском языке (хотя она несомненно иностранного происхождения) смысл абстрактности и обобщенности. Что вполне подходит к случаю, на мой взгляд.

мета- из греческого "рядом с" перекочевало как приставка в английский и русский, и укоренилось в узких значениях: на другом уровне, выше, ниже, после, между.

Мета-фора, мета-язык, мета-физика, и т.п.

 

А насчет распространенности это да. Мы любим кальку. Большая часть слов в современном Русском - заимствованы.



#12 Оффлайн   Ktlo

Ktlo
  • Автор темы
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                    

Отправлено 27 Август 2015 - 21:14

Обновил и добавил про метаметоды сравнения. Возможно потом, что-то ещё буду дописывать, но скорее нет. Вроде описал все поля, используемые в метатаблицах. Но если что-то забыл, пишите.


  • Mecopy6ka и swg2you это нравится

#13 Оффлайн   SergOmarov

SergOmarov
  • Пользователи
  • Сообщений: 564
  • Уровень сигнала: 0,3%
  • В игре: 2 час. 36 мин.

Награды

     

Отправлено 29 Август 2015 - 18:44

Наверное следует упомянуть, что __index и __newindex могут быть не только методами, но и таблицами. На счет остальных заклинаний не уверен.

Еще может быть __call, если ее саму можно вызвать



#14 Оффлайн   Ktlo

Ktlo
  • Автор темы
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                    

Отправлено 29 Август 2015 - 20:50

Еще может быть __call, если ее саму можно вызвать

Нет, я проверил в Lua интерпритаторе, и твоё предположение на счёт __call не работает.



#15 Оффлайн   SergOmarov

SergOmarov
  • Пользователи
  • Сообщений: 564
  • Уровень сигнала: 0,3%
  • В игре: 2 час. 36 мин.

Награды

     

Отправлено 14 Сентябрь 2015 - 08:16

Жаль, по логике должно работать(если ты проверял в интерпритаторе на сайте - он кривой)



#16 Оффлайн   Ktlo

Ktlo
  • Автор темы
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                    

Отправлено 14 Сентябрь 2015 - 08:22

Жаль, по логике должно работать(если ты проверял в интерпритаторе на сайте - он кривой)

Я проверял не на сайте, а в официальном интерпритаторе от создателей языка программирования. Версия - Lua 5.3, если что.

 

P.S. Утренняя переписочка


Сообщение отредактировал Ktlo: 14 Сентябрь 2015 - 08:22


#17 Оффлайн   SergOmarov

SergOmarov
  • Пользователи
  • Сообщений: 564
  • Уровень сигнала: 0,3%
  • В игре: 2 час. 36 мин.

Награды

     

Отправлено 14 Сентябрь 2015 - 11:35

Жаль что не пашет(



#18 Оффлайн   Ktlo

Ktlo
  • Автор темы
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                    

Отправлено 28 Март 2016 - 16:42

Тема обновлена

Добавлены математический метаметод __idiv() и метаметоды для битовых операторов.



#19 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 28 Март 2016 - 17:38

Оператор //
Это что за оператор?  В Луа 5.2 не работает.

#20 Оффлайн   Ktlo

Ktlo
  • Автор темы
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                    

Отправлено 28 Март 2016 - 17:56

Это что за оператор?  В Луа 5.2 не работает.

В Lua 5.3 его добавили. До этого такого не было.



#21 Оффлайн   TC1061

TC1061
  • Пользователи
  • Сообщений: 39
  • Уровень сигнала: 6,93%
  • В игре: 59 час. 28 мин.

Отправлено 21 Август 2017 - 17:23

Жаль что не пашет(

Что-то вы все не так делаете. У меня на интерпретаторе Lua 5.1 все норм пашет. В Lua 5.2 тоже должно - ведь работает же в OpenComputers такое, да? С Lua 5.3 тоже самое. 

 

P. S. Теперь я понял. Оказывается, у меня тоже не работает. Хотя, можно это все обернуть в функцию:

t={}
pseudofunctionTable=setmetatable({},{__call=function(self,...) print("it works!",...) end})
mt={__call=function(self,...) pseudofunctionTable(...) end}
setmetatable(t,mt)
t("and this is cool.")

Сообщение отредактировал TC1061: 17 Апрель 2018 - 16:09






Темы с аналогичным тегами lua, meta, metatable, setmetatable, getmetatable, OOP, ООП

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных