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

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

А в какой момент срабатывает уборщик, который, собственно, и удаляет ?

Или ВО ВСЕХ без исключения реализациях lua все эти nil в таблицах лежат пожизненно ?

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

t = {1,nil,3}
print(#t) --> 3

Понимать как кому угодно?

Есть поле, или нет?

Поэтому и считаю что это не эквивалентно удалению. Это уже пото-о-о-м, на основе того, что значение поля nil будет удаление.

Но не на данный момент. На данный момент я ключу присвоил конкретное lua значение - nil.

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

Сильно подозреваю, что в этом вот конкретном сталкере, а не в сферическом Луа в вакууме, результат # и все последующие вообще не определен при операциях с присваиванием, кроме первого for i = 1, n do t=что_нибудь_не_nil end; #t

(вместо # может быть table.*(), которая также получает размер).

 

По крайней мере у меня в свое время такие чудеса получались, что даже и описать невозможно: то есть, вот буквально в разные моменты - абсолютно разные.

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

@Dennis_Chikin, Да я не конкретно оператор # рассматриваю.
Вот поставь метатаблицу для t с __newindex, и присвой ключу значение nil.
Вызывается же этот метаметод, а значит всё-таки не удаление, а изменение.

Косвенно конечно, но в сумме мне достаточно для этой точки зрения.

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

Не, нафиг. В смысле, я вот в этом сталкере столько чудес с таблицами насмотрелся, что пытаться воспроизводить на любом 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.

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

И где в нем написано про то, в какой именно момент и что он меняет в таблице ?

Стандарт языка: 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} Изменено пользователем abramcumner
Ссылка на комментарий

Подскажите, как заспавнить объект на уровне примерно 1 метра над землёй? 

Пробовал так, но спавн происходит в метре от актора, и сам объект появляется на земле. 

alife():create("my_item", db.actor:position():add(db.actor:direction():add(1)), db.actor:level_vertex_id(), db.actor:game_vertex_id())
Ссылка на комментарий

@abramcumner
Я всё это знаю, читал, и слава Богу ещё помню.
Не в этом дело. Сам факт.

Ну вот посчитала lua в этот раз, что #t ==3. Так уж вышло что не 1. К примеру.
Пишу :

t = {1,2,3}
t[2]=nil

По Вашему удалил я его. Совсем. И след простыл. И поверил я что так и есть (к примеру).

 

А lua мне пишет что 3 поля. И я ей ничего не делал. Сама, гадина, решила наплевать на мой nil. Врет и не краснеет.
Теперь я больше не буду ей доверять. Сказали "нет поля" - значит нет. И точка. Пусть свои тройки и дальше пишет. Плевать я хотел.

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

А lua мне пишет что 3 поля. И я ей ничего не делал. Сама, гадина, решила наплевать на мой nil. Врет и не краснеет. Теперь я больше не буду ей доверять. Сказали "нет поля" - значит нет. И точка. Пусть свои тройки и дальше пишет. Плевать я хотел.

Луа не пишет же про три поля :) Луа пишет, что после третьего поля идет нил. Посмотри, что выдаст тебе луа на t = {1, nil, 3, nil}
Ссылка на комментарий

Я могу только аналогию с надписью на заборе привести. Так и здесь: в стандарте написано,

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

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

Да мне всё равно что она выдаст. Вернее я знаю что.

Всяких вариантов и сам могу наклепать предостаточно.

Я говорю про конкретный случай.

Оператор # работает с массивом.Так? А ты сам говоришь 

после третьего поля

Т.е. если это массив (раз # так отработал - факт), то есть и второе поле.

И если бы не было второго поля, то t[3] показало бы nil в массиве. А тройка была бы в t[2] Но нет. Показывает 3.

Значит всё-таки массив с тремя полями. И хоть я написал t[2]=nil, никуда оно не удалилось.

Зачистилось значение - да.

Уже не помню где, но читал в доках, что lua до последнего старается сохранить таблицу как массив, а не как хэш.

Выражения "массив" и "хэш" не совсем точно определил, но думаю понятно что я имел в виду.

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

По мне разногласия возникли изза разного интерпретирования удаления из таблицы. @Nazgool говорит, я так понял, об удалении со смещением, @abramcumner же про просто выпиливание значения.

Не понял того, кто, кому и что хочет разъяснить.

ТЧ 1.0004. SAP и Trans mod

github

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

@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}).
Но на этом этапе, выходит, никакого удаления полей нет.

Поэтому и называю "изменение значения" а не "удаление".

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

1

 

А что должно быть ?

И, главное, чем это нам поможет ?

 

А самое интересное, если сделать

t = {1, nil, 3}

#t

t[4] = 4

print(#t)

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

поля в ней никуда не деваются в отличии от 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)
Изменено пользователем abramcumner
Ссылка на комментарий
@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
Оно может ей пока и понадобиться, как я только что под спойлером показал.
 
Именно об этом битый ... толкую.
А остальное - это уже совсем другая история. Л.Каневский.
Изменено пользователем Nazgool
Ссылка на комментарий

Такой вопрос - пользуюсь функцией телепортации ( на свалке ) но вот что интересно - какие бы координаты не вписал, всё равно телепортирует в ОДНУ точку, координаты которой видимо из воздуха беруться... Хоть так делай -

 

 

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

 

 

Где я ошибся? На других локациях все прекрасно работает...

Не соответствует правилам.

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...