Nazgool 250 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 (изменено) t = {1,nil,3} print(#t) --> 3 Понимать как кому угодно? Есть поле, или нет? Поэтому и считаю что это не эквивалентно удалению. Это уже пото-о-о-м, на основе того, что значение поля nil будет удаление. Но не на данный момент. На данный момент я ключу присвоил конкретное lua значение - nil. Изменено 22 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 (изменено) Сильно подозреваю, что в этом вот конкретном сталкере, а не в сферическом Луа в вакууме, результат # и все последующие вообще не определен при операциях с присваиванием, кроме первого for i = 1, n do t=что_нибудь_не_nil end; #t (вместо # может быть table.*(), которая также получает размер). По крайней мере у меня в свое время такие чудеса получались, что даже и описать невозможно: то есть, вот буквально в разные моменты - абсолютно разные. Изменено 22 Июня 2016 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 (изменено) @Dennis_Chikin, Да я не конкретно оператор # рассматриваю.Вот поставь метатаблицу для t с __newindex, и присвой ключу значение nil.Вызывается же этот метаметод, а значит всё-таки не удаление, а изменение. Косвенно конечно, но в сумме мне достаточно для этой точки зрения. Изменено 22 Июня 2016 пользователем Nazgool Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 (изменено) Не, нафиг. В смысле, я вот в этом сталкере столько чудес с таблицами насмотрелся, что пытаться воспроизводить на любом stand-alone lua не имеет смысла. Для себя определился, что вот как-то так: if n >= 2 then table_sort( t, function( a, b ) return b < a end ) end for i, v in ipairs( t ) do table_remove( idx_t, v ) table_remove( upd_t, v ) end upd_n = upd_n - n (не в тему, но форум все равно склеит) только что обнаружил забавное: у ряда game_объектов, как минимум, у рестрикторов, имеет место функция object(). Что делает - неизвестно. Обнаружено в результате ошибочной копипасты self.object вместо self. Изменено 22 Июня 2016 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
abramcumner 1 145 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 (изменено) И где в нем написано про то, в какой именно момент и что он меняет в таблице ?Стандарт языка: https://www.lua.org/manual/5.1/manual.html#pdf-pairs pairs (t) Returns three values: the next function, the table t, and nil, so that the construction for k,v in pairs(t) do body end will iterate over all key–value pairs of table t. See function next for the caveats of modifying the table during its traversal. next (table [, index]) Allows a program to traverse all fields of a table. Its first argument is a table and its second argument is an index in this table. next returns the next index of the table and its associated value. When called with nil as its second argument, next returns an initial index and its associated value. When called with the last index, or with nil in an empty table, next returns nil. If the second argument is absent, then it is interpreted as nil. In particular, you can use next(t) to check whether a table is empty. The order in which the indices are enumerated is not specified, even for numeric indices. (To traverse a table in numeric order, use a numerical for or the ipairs function.) The behavior of next is undefined if, during the traversal, you assign any value to a non-existent field in the table. You may however modify existing fields. In particular, you may clear existing fields. Выделил нужное. t = {1,nil,3} print(#t) --> 3 Понимать как кому угодно?Есть поле, или нет? Поэтому и считаю что это не эквивалентно удалению. Это уже пото-о-о-м, на основе того, что значение поля nil будет удаление. Но не на данный момент. На данный момент я ключу присвоил конкретное lua значение - nil. Заниливание равно удалению. Оператор решетка выводит не размер таблицы, а номер любого места, после которого идет nil.Для таблиц без дыр это равно размеру таблицы. Для таблицы с дырами, как в примере выше, луа может вывести и 1 и 3. И это строго по стандарту: If the array has "holes" (that is, nil values between other non-nil values), then #t can be any of the indices that directly precedes a nil value (that is, it may consider any such nil value as the end of the array).Можешь посмотреть, что решетка выведет для таблицы t = {1, nil, 3, nil} Изменено 22 Июня 2016 пользователем abramcumner Ссылка на комментарий
hi_flyer 75 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 Подскажите, как заспавнить объект на уровне примерно 1 метра над землёй? Пробовал так, но спавн происходит в метре от актора, и сам объект появляется на земле. alife():create("my_item", db.actor:position():add(db.actor:direction():add(1)), db.actor:level_vertex_id(), db.actor:game_vertex_id()) Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 @hi_flyer, Координату Y пробовал крутить? Ссылка на комментарий
Nazgool 250 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 (изменено) @abramcumner, Я всё это знаю, читал, и слава Богу ещё помню.Не в этом дело. Сам факт. Ну вот посчитала lua в этот раз, что #t ==3. Так уж вышло что не 1. К примеру.Пишу : t = {1,2,3} t[2]=nil По Вашему удалил я его. Совсем. И след простыл. И поверил я что так и есть (к примеру). А lua мне пишет что 3 поля. И я ей ничего не делал. Сама, гадина, решила наплевать на мой nil. Врет и не краснеет.Теперь я больше не буду ей доверять. Сказали "нет поля" - значит нет. И точка. Пусть свои тройки и дальше пишет. Плевать я хотел. Изменено 22 Июня 2016 пользователем Nazgool Ссылка на комментарий
hi_flyer 75 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 @TIGER_VLAD, Не подскажешь каким образом? Ссылка на комментарий
abramcumner 1 145 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 А lua мне пишет что 3 поля. И я ей ничего не делал. Сама, гадина, решила наплевать на мой nil. Врет и не краснеет. Теперь я больше не буду ей доверять. Сказали "нет поля" - значит нет. И точка. Пусть свои тройки и дальше пишет. Плевать я хотел.Луа не пишет же про три поля Луа пишет, что после третьего поля идет нил. Посмотри, что выдаст тебе луа на t = {1, nil, 3, nil} Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 Я могу только аналогию с надписью на заборе привести. Так и здесь: в стандарте написано, а вот когда берется размер таблицы и где он хранится, и в какой момент, все-же, таблица перетряхивается на предмет чистки мусора - только исходники смотреть. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 (изменено) Посмотри, что выдаст тебе луа Да мне всё равно что она выдаст. Вернее я знаю что. Всяких вариантов и сам могу наклепать предостаточно. Я говорю про конкретный случай. Оператор # работает с массивом.Так? А ты сам говоришь после третьего поля Т.е. если это массив (раз # так отработал - факт), то есть и второе поле. И если бы не было второго поля, то t[3] показало бы nil в массиве. А тройка была бы в t[2] Но нет. Показывает 3. Значит всё-таки массив с тремя полями. И хоть я написал t[2]=nil, никуда оно не удалилось. Зачистилось значение - да. Уже не помню где, но читал в доках, что lua до последнего старается сохранить таблицу как массив, а не как хэш. Выражения "массив" и "хэш" не совсем точно определил, но думаю понятно что я имел в виду. Изменено 22 Июня 2016 пользователем Nazgool Ссылка на комментарий
Desertir 202 Опубликовано 22 Июня 2016 Поделиться Опубликовано 22 Июня 2016 По мне разногласия возникли изза разного интерпретирования удаления из таблицы. @Nazgool говорит, я так понял, об удалении со смещением, @abramcumner же про просто выпиливание значения. Не понял того, кто, кому и что хочет разъяснить. ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Nazgool 250 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) @Desertir, Смотри. Из-за чего всё началось. Я сказал что t=nil не удаляет поле, а изменяет его значение. Кто действительно удаляет поле, так это table.remove Мне сказали что t=nil тоже удаляет поле Вот я и пытался показать что только t=nil не перестраивает таблицу. И при итерации поля в ней никуда не деваются в отличии от table.remove. Вот тут всё прекрасно видно t = {1,2,3,4,5} for i, v in ipairs(t) do print(i,v) table.remove(t,i) end --> 1 1 --> 2 3 --> 3 5 for i, v in ipairs(t) do print(i,v) t[i]=nil end --> 1 1 --> 2 2 --> 3 3 --> 4 4 --> 5 5 Т.е. во втором случае next читает поля и дальше, как ни в чем не бывало. А значит никуда они не деваются. Просто я даю им новое значение - nil. С оператором # ещё яснее. for i = 1, #t do print(i,t[i]) table.remove(t,i) end --> bla-bla --> bad argument #1 to 'remove' (position out of bounds) for i = 1, #t do print(i,t[i]) t[i]=nil end Если t=nil отрабатывает нормально, то с table,remove ошибка - "position out of bounds". Т.е. снова. Хоть я nil и присваиваю, но поля остаются. Да, при повторном использовании полей уже не будет. lua приберет (и то не всегда. показывал уже с t={1.nil,3}).Но на этом этапе, выходит, никакого удаления полей нет. Поэтому и называю "изменение значения" а не "удаление". Изменено 23 Июня 2016 пользователем Nazgool Ссылка на комментарий
abramcumner 1 145 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 @Nazgool, выполни уже: t = {1, nil, 3, nil} print(#t) Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) 1 А что должно быть ? И, главное, чем это нам поможет ? А самое интересное, если сделать t = {1, nil, 3} #t t[4] = 4 print(#t) Изменено 23 Июня 2016 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
abramcumner 1 145 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) поля в ней никуда не деваются в отличии от table.removeА вот и по поводу table.remove примерчик: t={1,2,3} print(#t) table.remove(t,4) -- ошибки нет! print(#t) table.remove(t,3) print(#t) table.remove(t,3) -- ошибки нет! print(#t) table.remove(t,4) -- а теперь уже ошибка print(#t) Как видно table.remove тоже поля никуда не девает А теперь про чистку мусора: t={1,2,3} print(#t) table.remove(t,4) -- remove проходит с макс. индексом 4 => "размер" таблицы 4 t[3]=nil print("t[3]=nil") table.remove(t,3) -- remove проходит с макс. индексом 3 => "размер" таблицы 3 t[2]=nil print("t[2]=nil") table.remove(t,2) -- remove проходит с макс. индексом 2 => "размер" таблицы 2 print(#t) Изменено 23 Июня 2016 пользователем abramcumner Ссылка на комментарий
Nazgool 250 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) @abramcumner, Ты в 5.3 тестируешь что-ли? Да и не важно, пусть в 5.3 и ошибка, но поля-то она правильно удаляет. Как же мне это ещё объяснить? Во-первых моё выражение "никуда не деваются" не верное. Признаю. Правильнее сказать "не определяются". И мои примеры с ipairs этому подтверждение. Во всем остальном остаюсь на своём. Вот то, от чего я отталкиваюсь, и что уже говорил - "lua до последнего старается сохранить таблицу как массив" t = {} t[1]=1 --> #t == 1 Всё верно. lua не куда деваться, есть элемент с индексом 1 - значит есть и массив t[3]=3 --> #t == 1 Сработала неопределённость оператора #. Ну вот решила lua что не хочет добавлять это поле в массив. t[4]=4 --> #t == 4 Теперь есть три конкретных элемента и одна дырка, значит можно создать массив(подумала lua) t[6]=6 --> #t == 4 Одну поблажку сделала - пока хватит. Пусть остается как есть (опять же её мысли передаю). t[8]=8 --> #t == 8 Вот это уже снова похоже на массив. Так тому и быть. print(#t) --> 8 Фууух. Насилу собрала массив. t[1]=nil --> #t == 8 То что зачистили одно поле ещё не значит что буду валить всё то, что так тяжело строила. t[2]=nil --> #t == 8 Не легко держать массив, но ничего. Выдюжим и это. t[3]=nil --> #t == 8 Безобразие конечно, но пойду на принцип. Моё ведь. t[4]=nil --> #t == 8 Караул, грабят. Отбиваюсь как могу. t[6]=nil --> #t == 8 Ни грамма сусликам. Нажито непосильным трудом. Не отдам и всё тут. print(#t) --> 8 Победа Так вот о чем и говорю - НЕ я, сама lua определяет поле [8]=8 при "дырках" от 1-го до 7-го поля. А как она определяет что поле именно с индексом [8], а не [144] например? Не потому ли, что перед ним есть поля с индексами 1-7? Значит есть таки поля? Т.е. они определились как поля. И они (пока) не удаляются, а только зачищаются их значения. И я говорю, что записав t=nil мы только лишь изменяем значение. Нельзя сказать что я удаляю поле. Не нам это решать а lua Оно может ей пока и понадобиться, как я только что под спойлером показал. Именно об этом битый ... толкую.А остальное - это уже совсем другая история. Л.Каневский. Изменено 23 Июня 2016 пользователем Nazgool Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Такой вопрос - пользуюсь функцией телепортации ( на свалке ) но вот что интересно - какие бы координаты не вписал, всё равно телепортирует в ОДНУ точку, координаты которой видимо из воздуха беруться... Хоть так делай - function faza_func() local a = vector(277.31616210938,-8.4802932739258,-130.72814941406)level.add_pp_effector ("teleport.ppe", 2009, false)db.actor:set_actor_position(a)end Хоть так - function faza_func()local a = vector(0,0,0)level.add_pp_effector ("teleport.ppe", 2009, false)db.actor:set_actor_position(a)end Где я ошибся? На других локациях все прекрасно работает... Не соответствует правилам. Ссылка на комментарий
Overfirst 630 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) @CRAZY_STALKER666, vector():set(x,y,z) попробуй. Изменено 23 Июня 2016 пользователем BoBaH_671 1 Ранее был известен под ником BoBaH_671. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти