Строка 520: |
Строка 520: |
| | | |
| = Оператор пути = | | = Оператор пути = |
| + | |
| + | Операторы . и : также могут использоваться в выражениях пути наряду с обычным разделителем /, который вы уже видели. Их значение в этом контексте напоминает то, как они ведут себя в выражениях разыменования. Все операторы пути объединяет то, что они должны находиться непосредственно рядом со своими аргументами без промежутка. |
| + | |
| + | path-expression/path-expression |
| + | path-expression.path-expression |
| + | path-expression:path-expression |
| + | |
| + | Пути используются в DM в двух контекстах. Первый - в определениях объектов. В этом случае путь используется для создания узлов в дереве кода. Второй контекст - в выражениях, где значения пути ссылаются на типы объектов. В этом случае ссылка на тип всегда должна начинаться с оператора ''path'', чтобы быть правильно распознанной. Это легко запомнить, потому что почти всегда нужно начинать с /, как вы скоро увидите. |
| + | |
| + | == / разделитель между родителями и детьми == |
| + | |
| + | Оператор / используется в пути между родительским и дочерним объектами. В контексте определения объекта это эквивалентно новой строке и дополнительному уровню отступа. |
| + | |
| + | В начале пути этот оператор дает особый эффект, начиная с корня (или верхнего уровня) кода. Обычно путь относят к той позиции в коде, где он используется. Например, если вы находитесь внутри узла obj и определяете scroll, то на самом деле вы определяете /obj/scroll, и именно так вы будете ссылаться на этот тип в других местах кода. Путь, начинающийся с /, называется абсолютным путем, чтобы отличить его от других относительных путей. |
| + | |
| + | == . оператор пути поиска == |
| + | |
| + | Оператор . (точка) в пути ищет указанного ребенка, начиная с текущего узла, затем его родителя, родителя его родителя и так далее. Именно за такое восходящее поведение поиска мы называем его оператором "look-up". Очевидно, что для его работы узел, который вы ищете, должен уже существовать. |
| + | |
| + | Чаще всего этот оператор используется для указания типа объекта-предка. Например, можно определить группы мобов, которые всегда приходят друг другу на помощь в бою. |
| + | |
| + | mob |
| + | var/species_alignment |
| + | dragon |
| + | species_alignment = .dragon |
| + | red |
| + | green |
| + | black |
| + | species_alignment = .black |
| + | snake |
| + | species_alignment = .snake |
| + | cobra |
| + | winged |
| + | species_alignment = .dragon |
| + | pit_viper |
| + | species_alignment = .dragon/black |
| + | |
| + | В этом примере переменная species_alignment предназначена для указания того, к какой группе существ данный тип мобов относится как к союзникам. Для этого в переменной хранится тип объекта. Два моба с одинаковыми значениями species_alignment будут друзьями. |
| + | |
| + | В этом примере драконы выровнены друг с другом, кроме черного, который выровнен самостоятельно. Змеи выровнены друг с другом, кроме крылатых, которые выровнены с драконами, и ядовитых гадюк, которые выровнены с черным драконом. |
| + | |
| + | Используя оператор ''dot'', мы избежали использования абсолютных путей. Это не только более компактно, но и менее подвержено риску стать недействительным при внесении определенных изменений в код (например, при перемещении дракона и змеи в /mob/npc/dragon и /mob/npc/snake). |
| + | |
| + | == : оператор пути с видом вниз == |
| + | |
| + | Оператор : ищет дочерний узел, начиная с текущего узла, а затем, если необходимо, во всех его дочерних узлах. По этой причине его называют оператором пути с поиском вниз. В начале пути он заставляет поиск вестись от корня. |
| + | |
| + | Предыдущий пример можно изменить, заменив оператор точки на : . Например, .dragon/black можно заменить на :black или :dragon:black или /mob:dragon:black, в зависимости от того, насколько неоднозначно название `black'. Если существуют и /mob/dragon/black, и /obj/potion/black, то вам нужно будет включить достаточно информации, чтобы отличить черного дракона от черного зелья. В противном случае может быть выбрано не то, что нужно. |
| + | |
| + | Операторы . ''dot'' и : ''path'' схожи по смыслу при работе с путями и переменными. Оператор ''dot'' обращается либо к узлу, либо к переменной, определенной в указанной позиции или выше. Оператор : обращается к узлу или переменной, определенной в указанной позиции или ниже. |
| + | |
| + | Одним из эффективных способов использования различных операторов пути является изменение определения объекта из другого места в коде. Это иногда полезно при работе с большими проектами, разделенными на несколько файлов. Подробнее об этом будет рассказано в главе 19. Пока же это шуточный пример: |
| + | |
| + | obj/corpse |
| + | icon = 'corpse.dmi' |
| + | |
| + | mob |
| + | dragon |
| + | icon = 'dragon.dmi' |
| + | |
| + | :corpse //add to corpse definition |
| + | var/dragon_meat |
| + | |
| + | В этом примере переменная добавляется в /obj/corpse из определения mob/dragon. Предполагается, что затем она будет каким-то образом использоваться кодом дракона. Например, когда дракон умирает и создает труп, переменная dragon_meat может быть установлена в 1. Другой дракон, наткнувшись на такой труп, может защитить его от падальщиков. Можно было бы найти и другие способы добиться того же самого, но суть в том, что мы смогли поместить определение переменной рядом с единственным местом в коде, где она будет использоваться - хороший способ организации вещей. |
| | | |
| = Очередность операций = | | = Очередность операций = |