Перейти к контенту

Курилка программистов


Рекомендуемые сообщения

 

 

Обять двадцать пять. Сколько можно повторять: в Lua нет никаких классов

Хосспаде да сколько можно. Начнем с того что все что вы изложили в своем посте, я и так знаю, и думаю что всякий, кто понимает ООП немного лучше чем "это что-то непонятное", понимает ситуацию в Луа вполне адекватно.

А во вторых, сами же цитируете меня.

Ну если прям вообще новый класс, то это через движок. И никак иначе.

 

Это не Луа. Неужели не видно?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
Мы даём этой связке идентификатор - и это не что иное, как имя класса. По имени класса мы создаём конкретный экземпляр класса функцией create.

Да нет. Вы создаете новый экземпляр объекта (а по сути просто получаете ссылку на таблицу), структура и некоторый набор свойств которого уже определены в ядре. Вы можете добавить ему некоторые свои методы. Это верно. Но это не новый класс. Попробуйте создать по своему алгоритму класс, например, облака и погонять его по небу.

Изменено пользователем Serge!
Ссылка на комментарий

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

А в чем проблема?

class "Cloud"
function Cloud:__init()
end

function Cloud:FlyOnTheSky()
end

local cloud = Cloud()
cloud:FlyOnTheSky()
Изменено пользователем abramcumner
Ссылка на комментарий

Ну вот не декларация, вот ветер гоняет облака по небу

class "Cloud"
function Cloud:__init()
  self.x = 0;
  self.y = 0;
end

function Cloud:FlyOnTheSky(dt)
  local wind = GetCurrentWind()
  self.x = self.x + wind.X * dt
  self.y = self.y + wind.Y * dt
end

local cloud = Cloud()
cloud:FlyOnTheSky(0.1)
Ссылка на комментарий

 

 

новый экземпляр объекта ...это не новый класс

Извиняюсь конечно, но наблюдаю явное незнание терминологии. Экземпляр класса - это и есть объект. Это синонимы. Экземпляр объекта - это масло маслянное. И ещё раз повторяю, класс - это надязыковое понятие, часть парадигмы ООП. Как именно класс реализуется в конкретном языке - дело конкретного языка. Это может быть и специальный тип, как в С++, а может быть нечто другое, как в случае с игровыми объектами сталкира. Или ещё что-то другое, как в случае с НЕигровыми объектами во всё том же сталкире.

 

 

 

это лишь декларация и не более того.

Класс вообще-то по определению - декларация, обобщённое описание некоего множества объектов (АКА экземпляров класса).

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Нет комментариев, т.к. это уже пустой трёп начинается.

То есть по-твоему класс это нечто, умеющее выводить текстуры в рендере сталкера? :) Ну тоже ничего определение.
Ссылка на комментарий
Экземпляр класса - это и есть объект.

А я что сказал. Именно это, только с дополнением. Вы не можете создать свой класс, можете создать только объект - новый экземпляр класса, который был предопределён ядром. Lua, а именно он является единственным связующим между пользователем и ядром, может оперировать только с таблицами. Поэтому все созданные внутренние классы ядра (С++)  Вы после экспорта получаете как ссылки на эти таблицы (точнее метатаблицы). Когда же Вы в скрипте якобы создаете новый класс (через описание class), то просто создаете новую метатаблицу или пустую, или на основании уже существующей в ядре - т.н. "наследование". Где здесь классы?

Создайте всё-же полноценный класс облака.

Изменено пользователем Serge!
Ссылка на комментарий

А я что сказал

 

цитирую:

экземпляр объекта

Впрочем, наверное это была просто оговорка.

 

Вы не можете создать свой класс,

 

Да почему же не могу? Вот скриптовые серверные классы игровых объектов - вполне себе новые классы: можно добавить/заменить/дополнить методы, добавить новые данные. Т.е. мы определяем наследованием новый класс, потом даём ему имя (регистрируя в связке с клиентским), затем создаём экземпляры класса функцией create.

 

можете создать только объект - новый экземпляр класса, который был предопределён ядром. Lua, а именно он является единственным связующим между пользователем и ядром, может оперировать только с таблицами.

 

Ну для начала, если мы используем Luabind, то создаётся не таблица, а userdata. И я здесь не совсем понял сказанное. Мы создаём объект (если совсем точно, то его серверную половинку) так:

 

alife():create("section_name", pos, alvid, agvid)

 

Для этого нам надо уже иметь класс, который здесь неявно присутствует в виде параметра секции class. Создание класса происходит в виде а) наследования скриптового серверного класса от движкового и б) регистрации связки двух составляющих классов "скриптовый серверный / клиентский" с присвоением этой связке идентификатора - имени класса. Что не так?

 

Создайте всё-же полноценный класс облака.

 

При наличии соответствующего движкового API это вполне можно сделать. Я даже могу сказать, что именно для этого надо: колбек рендера, низкоуровневая функция отрисовки поверхности и соответствующий шейдер. Остальное на себя возьмут скрипты. Да вот хотя бы в OGSE скриптовый менеджер погоды по сути почти полностью заменяет движковый. В каком то смысле именно это и есть - класс "облака". Там от движка используется только блендер двух погод, который (если очень упростить) как раз и занимается тем, что рисует на небе две наложенные текстуры в заданной смеси.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

@Malandrinus, Мне всё больше и больше кажется, что мы говорим на разных языках, или не понимаем (не хотим понять) друг друга. Поэтому продолжение данной дискуссии считаю лишённой смысла.

На последок просто задам несколько вопросов, на которые сам и отвечу (как я считаю верным). 

1. В простом/классическом Си есть классы или их понятие?

Мой ответ: Нет ни по определению, ни по сути, ни по стандарту.

2. Можно ли средствами Си эмулировать классы, как они определены в Си++?

Мой ответ: Да и легко, учитывая, что в нём определены структуры, объединения, массивы и указатели.

3. Так есть, с учетом этого классы в Си?

Мой ответ: Нет. Я уже сказал и не стоит "воду в ступе толочь", но вполне возможна эмуция этого понятия.

4. Есть классы в Lua?

Мой ответ: Нет (см. описание стандарта и комментарии Разработчиков языка).

5. Можно ли средствами Lua эмулировать классы?

Мой ответ: Да, а, учитывая прекрасно реализованные механизмы таблиц и, особенно, метатаблиц, ещё проще и "элегантнее" чем в простом Си.

6. Есть классы в Сталкере?

Мой ответ: Нет., т.к. скриптовый интерфейс ядра с пользователем основан на Lua.

7. Можно ли эмулировать классы в Сталкере?

Мой ответ: Да. См. п. 5

8. Так можно ли называть в Сталкере эти "эмулянты" классами?

Мой ответ: Всё можно называть как угодно и чем угодно, главное, чтобы читающий понимал: "А что же всё таки за этими словами и названиями есть на самом деле?". При условии, что ему такое вообще надо, разумеется.

 

Захотите? напишите свои ответы, не захотите - тоже приемлемо.

Удачи.

Изменено пользователем Serge!
Ссылка на комментарий

По-моему бесполезный разговор.
Кто-то определил, что в Срр класс - это какой-то там тип. В других языках - другое. Не важно.

Всё сводится к тому, что класс - это некая общность объектов.
И он может порождать другие общности или индивидуумы. И использовать при этом ООП.

Не важно как это выглядит с точки зрения общепринятых канонов.
Главное в том, что в lua это работает именно так как нужно.
На lua можно написать класс собственным способом. С собственным ООП. Другими словами так как необходимо.
Т.е. и с множественным наследованием, и с public\private данными. И ... (i love lua) много с чем.

Да, в lua класс - это объект. Таблица с метатаблицей и т.д. но это всего лишь способ.
И главное ведь не детали реализации, а выходной результат. И он есть.Такой как требуется.
Что ещё нужно от lua?

Я точно знаю что не нужно.
Не нужно требовать от этого малыша слишком многого. По своим возможностям это и так ребенок-индиго.

Изменено пользователем Nazgool
Ссылка на комментарий

@Nazgool, Всё правильно. Я уже давно написал, что активно пользуюсь такой возможностью и мне, простите, плевать кто и как её называет. Но... меня обвинили в незнании "терминологии". Мне это не очень понравилось, хотя "ходячую энциклопедию" или  "истину в последней инстанции" я из себя никогда и не строил.

Как то так.

Ссылка на комментарий

@Serge!,

Я вообще ни разу не программист, не теоретик и почти не практик.

Так что терминология это не то что моё слабое место, а вообще - ей нет места :)
Я говорю только с позиции "почти не практик". И она мне говорит то, о чем я напмсал выше.

 

А спорить?
Вроде говорят что в споре рождается истина?
Как-то случается по жизни, что в споре рождаются либо враги, либо "підлабузники" (укр. - не могу подобрать слова лучше этого, уж извините).

Так что спорить тоже бесполезно.

Друзья всё равно не родяться, т.к. оные познаются только в беде.

А этот спор уж никак не беда :)

Изменено пользователем Nazgool
Ссылка на комментарий
терминология это не то что моё слабое место, а вообще - ей нет места

Понял, эта Ваша позиция.Я уважаю её, хотя и не поддерживаю.

 Но всё же немного терминов, хотя бы и из Википедии:

"Спор — столкновение мнений, позиций, в ходе которого рождается истинное мнение и где каждая из сторон аргументированно отстаивает своё понимание обсуждаемых проблем, и стремится опровергнуть доводы другой стороны.".

Здесь, на мой взгляд ключевым является слово "аргументировано". Я всё время (по крайней мере я так считаю) старался аргументировать свои постулаты цитатами и ссылками на какие-то первоисточники. К тому я не однократно говорил - да, это не классс, а эмуляция класса; это не ООП, а применение методов и подходов ООП; это эффективно и вполне приемлемо в сталкеровских скриптах. "Читайте, читайте, сличайте" (правда часть была и перенесена и удалена). Основным же аргументом другой стороны (я могу и ошибаться) был тезиси: "это не по понятиям" и "здесь так не принято" (немного утрирую). Потому и написал: " продолжение данной дискуссии считаю лишённой смысла.". И продолжать ее не буду.

Изменено пользователем Serge!
Ссылка на комментарий

@Serge!,

О, раз уж пошла такая пьянка.

Я во всём о чем был разговор особо не разбираюсь, а ты (мне кажется) знаешь о чем говоришь.

Это я к чему? Чтобы говорить о формулировках, нужно знать о предмете разговора. В этом я, в отличии от тебя с Malandrinus-ом слаб.

 

Так вот. Кто-нибудь. Ты или кто-то другой. Покажите мне (чтобы я знал) определение класса. Что это такое? Чтобы для меня это было раз и навсегда.

 

P.S. А то я в lua леплю свой класс, и хочу чтобы он был похож на настоящий (из формулировки).

Изменено пользователем Nazgool
Ссылка на комментарий
А то я в lua леплю свой класс, и хочу чтобы он был похож на настоящий

Лепите и не задумывайтесь о всякой словесной шелухе (тем более, цитат приводить не буду, что Вам это чуждо). К тому же разработчики (а плакали "мол у нас нет программистов сишников") даже предоставили возможность использовать в скриптах оператор class, которого в чистом Lua просто нет. Да, имеются некоторые ограничения при приминении конструкторов из-за полного отсутствия докуметации (если разумеется не лезть в само ядро), что иногда приводит к непредсказуемым результатам. Но это не критично, т.к. обходится тем или иным способом.

А так, не забивайте себе голову, хороший результат всегда отнивелирует, как здесь говорят, "костыли" (так и не узнал истинное значение этого термина) реализации.

 

споре рождаются либо враги, либо "підлабузники" (укр. - не могу подобрать слова лучше этого, уж извините)

Я не знаю украинского, а по русски бы сказал: "либо враги, либо сторонники/сподвижники". Хотя возможна и ещё одна сторона: "пофигисты". В жизни не всё так одназначно.

Изменено пользователем Serge!
Ссылка на комментарий

Можно вопрос - как заставить 2013 студию кушать старый math.h вместо нового?Собираю тч,а тут такая засада :

 

3DNow!Lib.cpp(57): error C2365: nan: переопределение; предыдущим определением было "функция"
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(508): см. объявление "nan"

 

 

Ссылка на комментарий

 

 

Лепите и не задумывайтесь

Это точно?

То бишь я могу тупо от себя залепить класс мутантов, не задумываясь о наследовании?

Ссылка на комментарий

Это конечно хорошо, но как говорят. - осведомлен значит вооружен.

Жаль что так и не узнал, но если что, то ничего страшного. Смогу и голыми руками :)

Изменено пользователем Nazgool
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...