Изменения

Перевод части оригинального гайда по DM "Оператор пути". Не претендую на полную точность перевода.
Строка 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. Другой дракон, наткнувшись на такой труп, может защитить его от падальщиков. Можно было бы найти и другие способы добиться того же самого, но суть в том, что мы смогли поместить определение переменной рядом с единственным местом в коде, где она будет использоваться - хороший способ организации вещей.
    
= Очередность операций =
 
= Очередность операций =
33

правки