Архив сообщества
2011 — 2019
Аватар Kawaiidesu~~~

Попробуем покодить? Урок третий.

Автор: Kawaiidesu~~~ · 23.03.2014, 00:53 · 21 сообщений

Сообщений в теме: 21

Kawaiidesu~~~#1

Здравствуйте, с вами снова я и сегодня мы разберём list, его возможности и особенности.

Ну-с, начнём.

list - как ни удивительно, но "лист"(Не слушайте меня двухнедельной давности, это связный список), это один из краеугольных камней бьёнда и, как я считаю, высокоуровневого программирования в целом. Листом является коллекция, группа элементов, последовательно соединённая друг за другом. Первый элемент имеет ссылку на второй, второй на третий и так далее. Также к листу можно обращаться как к массиву, используя квадратные скобки и адрес.

Теория-теория~~~~~

Лист может хранить в себе числа, строки, ссылки на объекты и много другое. Попробуем сделать свой первый лист.

Изображение

Один важный ньюанс: лист является не переменной, а объектом, следовательно его необходимо создать. Есть много способов сделать это, но list() я нахожу самым удобным.

Вот мы и создали лист, воспользуемся же им.

Изображение

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

После всех этих операций мы получили лист, который содержит две единицы, так как добавляли двумя способами. Они хранятся отдельно друг от друга и не никоим образом не взаимодействуют(list(1, 1)).

Изображение

Здесь же мы убрали один элемент из списка, получив list(1). Заметьте, пропали не оба, а лишь один элемент, который стоял в начале списка.

Точно также можно работать и с обычными объектами

Изображение

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

Перейдём к чему-то посложнее.

Бинарные операции с листами.

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

Изображение

В чём их соль? Они позволяют гарантировано держать в листе лишь один экземпляр объекта, то есть в листе этот объект будет фигурировать лишь однажды. Логика их проста:

сложение это создать лист из текущего листа ИЛИ этого объекта.

вычитание это создать лист из текущего листа И всех объектов кроме данного.

Я уверен, большинство тут знает конъюнкцию, дизъюнкцию и прочие страшные слова.

Изображение

Как вы могли заметить выше - листы также можно складывать и вычитать друг с другом. Сложение и вычитание, я думаю, не вызовут вопросов, а вот в бинарном пара может.

Почему же в бинарном сложении осталось две двойки? Ответ прост: новый лист записывается бинарным сложением каждого из элементов второго листа к первому листу. То есть вышеописанная операция может выглядеть как:

Изображение

С вычитанием всё немного по-другому. Сравниваются все элементы между листами и все повторяющиеся элементы записываются.

Чтож, с математикой мы закончили, перейдём к кое чему другому.

Во-первых, к листу можно обращаться как к массиву:

Изображение

Это значительно упрощает ситуации, когда ты точно знаешь позицию объекта.

Во-вторых, листу можно сделать свою индексацию:

Изображение

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

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

Изображение

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

З.Ы. Написано с большим перерывом

Скопировать ссылку
Loly#3
Magus (22 March 2014 - 16:15) писал:

Мало

По крайней мере достаточно для тех, кто не знает про листы.

Скопировать ссылку
Recei#4
Loly (22 March 2014 - 16:55) писал:

По крайней мере достаточно для тех, кто не знает про листы.

Да я о том, что нет примеров использования этого дела в коде. Всякие интересности.

Скопировать ссылку
Kawaiidesu~~~#8
Magus (22 March 2014 - 17:26) писал:

Да я о том, что нет примеров использования этого дела в коде. Всякие интересности.

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

Скопировать ссылку
Jack Rost#9

Добавил бы немного про массивы для тех, кто не в курсе.

И ты не написал, что лист в цикле можно юзать как

for(var/mob/M in mobs)

Сообщение отредактировал Jack Rost: 23 March 2014 - 14:04

Скопировать ссылку
Jarl#11
Armun (23 March 2014 - 03:22) писал:

Я не понял, зачем лист нужен.

Что бы не обращаться к куче предметов поодиночке, а сразу к всем в списке.

Скопировать ссылку
Lagius#12

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

Скопировать ссылку
Kawaiidesu~~~#13
Lagius (23 March 2014 - 06:09) писал:

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

Скорее односторонний лист. Практически идентичный стандартному связному списку в решётке.

Jack Rost (23 March 2014 - 00:18) писал:

Добавил бы немного про массивы для тех, кто не в курсе.

И ты не написал, что дист в цикле можно юзать как

for(var/mob/M in mobs)

Ох... Пока расписывал особенности, самое главное из головы вылетело.

Скопировать ссылку
Jack Rost#14

Ещё тогда добавь немного про view, range и т.д.

Armun (23 March 2014 - 03:22) писал:

Я не понял, зачем лист нужен.

Можно одни и теже действия пропистаь один раз, но использовать для всех объектов/тёрфов/мобов в списке.

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

Например руна культистов, которая совершает жертвоприношение, собирает список из определённых жертв, которые в это время стоят на руне(т.е это должны быть только люди или мартышки и НЕ культисты). На весь список жертв дальше совершается действие "принести в жертву"(если коротко описать несколько строк кода)

Скопировать ссылку
Armun#16
Jack Rost (23 March 2014 - 14:13) писал:

Ещё тогда добавь немного про view, range и т.д.

Можно одни и теже действия пропистаь один раз, но использовать для всех объектов/тёрфов/мобов в списке.

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

Например руна культистов, которая совершает жертвоприношение, собирает список из определённых жертв, которые в это время стоят на руне(т.е это должны быть только люди или мартышки и НЕ культисты). На весь список жертв дальше совершается действие "принести в жертву"(если коротко описать несколько строк кода)

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

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

Скопировать ссылку
Jarl#17

var/global/list/CanTwist = list(/obj/fork/,/obj/knife)

//Может выкалывать

/mob/proc/attacked(var/obj/W) //W for attacking weapon

..()

for(var/J in CanTwist)

if(J == W.type) EYE.DIE()

Так будет убивать глаз, если в листе МожетВыкалывать есть путь к оружию через запятую.

Скопировать ссылку
Gravitational Singularity#19
Цитата

var/global/list/CanTwist = list(/obj/fork/,/obj/knife)

//Может выкалывать

/mob/proc/attacked(var/obj/W) //W for attacking weapon

..()

for(var/J in CanTwist)

if(J == W.type) EYE.DIE()

никогда не случайте этого

тупого, тупорылого

ущербного, убогого

дегенерата

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

Скопировать ссылку
Jarl#20

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

Скопировать ссылку

Обратно в Кодинг