DM Guide 15: различия между версиями
ZLOFENIХ (обсуждение | вклад) м (clean up) |
м (Откат правок ZLOFENIХ (обсуждение) к версии Viol) |
||
Строка 1: | Строка 1: | ||
+ | ''Это 15 глава перевода оригинального руководства по Dream Maker от разработчиков.'' | ||
+ | [http://wiki.ss13.ru/index.php?title=All_about_the_code Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.] | ||
+ | [http://www.byond.com/docs/guide/chap15.html Оригинальная 15 глава руководства на английском языке] | ||
− | [[ | + | = Глава 15: Работа с текстом = |
− | [ | + | |
+ | ''Истинная магия — это изучение высших истин Природы.'' — Густавус Миллер, Что есть сон. | ||
+ | |||
+ | Строки текста – важная часть почти любого мира. Вы уже видели один хороший метод конструирования текста со встроенными аргументами и форматированием макросов. Есть другие элементарные команды, рассчитанные для работы с текстом. В этой главе мы вам о них и расскажем. | ||
+ | |||
+ | == findtext == | ||
+ | |||
+ | Команда ''findtext'' ищет внутри одной строки текста другую. Эта операция работает без учета регистра, а ''findText'' - с учетом. Есть и другие пары команд, следующие такому же принципу: команда, содержащая заглавную букву, учитывает регистр. | ||
+ | |||
+ | findtext(T1,T2,Start=1,End=0) | ||
+ | findText(T1,T2,Start=1,End=0) | ||
+ | T1 – строка, в которой выполняется поиск. | ||
+ | T2 – строка, которую мы ищем. | ||
+ | Start – номер символа, с которого начинаем поиск. | ||
+ | End – номер символа, на котором мы его заканчиваем. | ||
+ | Результатом служит номер первого символа найденной строки. Если искомый текст не найден, то результат будет 0. | ||
+ | |||
+ | ''0'' используется как стандартное значение для обозначения позиции, которой нет. То есть, если поиск не требуется прекращать ни на каком символе, или если строка не найдена. | ||
+ | |||
+ | Пример использования ''findtext()'' для поиска в разговоре ключевых слов: | ||
+ | |||
+ | mob/rat | ||
+ | verb/tell(msg as text) | ||
+ | set src in oview() | ||
+ | if(findtext(msg,"cheese")) | ||
+ | view() << "[src] looks at [usr] hopefully." | ||
+ | walk_to(src,usr) | ||
+ | |||
+ | == copytext == | ||
+ | |||
+ | Команда ''copytext'' копирует кусок строки. Эта команда, и предыдущая ''findtext'' то же самое, что и команды ''copy'' и ''find'' в стандартном текстовом редакторе. | ||
+ | |||
+ | copytext(Txt,Start=1,End=0) | ||
+ | Txt – строка из которой мы хотим скопировать часть. | ||
+ | Start – номер стартового символа. | ||
+ | End – номер символа, на котором нужно остановиться. | ||
+ | Возвращает получившуюся строку. | ||
+ | |||
+ | == addtext == | ||
+ | |||
+ | Команда addtext объединяет две и более строк в одну. Это также можно сделать, вставляя строки одну за другой в другую строку, но когда нужно объединить много значений, проще использовать ''addtext()''. | ||
+ | |||
+ | addtext(Txt1,Txt2,...) | ||
+ | Возвращает одну строку, полученную путем слияния заданных. | ||
+ | |||
+ | == lentext == | ||
+ | |||
+ | Команда ''lentex'' измеряет количество символов в строке. | ||
+ | |||
+ | lentext(Txt) | ||
+ | Txt – строка, длину которой вы хотите узнать. | ||
+ | Возвращает число символов в строке. | ||
+ | |||
+ | == Изменение текста == | ||
+ | Есть несколько операций для изменения формы. Расскажем о каждой из них поподробнее. | ||
+ | |||
+ | === uppertext === | ||
+ | |||
+ | Команда ''uppertext'' переводит любые символы нижнего регистра в верхний регистр. | ||
+ | |||
+ | uppertext(Txt) | ||
+ | Txt – текст, который вы хотите изменить. | ||
+ | Возвращает полученную строку. | ||
+ | |||
+ | === lowertext === | ||
+ | |||
+ | Команда ''lowertext'' переводит любые символы верхнего регистра в нижний. | ||
+ | |||
+ | lowertext(Txt) | ||
+ | Txt – текст, который вы хотите изменить. | ||
+ | Возвращает полученную строку. | ||
+ | |||
+ | === text2num === | ||
+ | |||
+ | Команда ''text2num'' переводит строку в числовое значение. Если текст не состоит из символов цифр, то команда вернет ''0''. | ||
+ | |||
+ | text2num(Txt) | ||
+ | Txt – текст, который вы хотите изменить. | ||
+ | Возвращает соответствующее число. | ||
+ | |||
+ | Важно знать, что текстовое значение кардинально отличается от числового, даже если визуально они похожи. Если вы попробуете совершить числовые операции со строкой, то у вас ничего не выйдет, потому что все текстовые цепочки и прочие нечисловые значения равнозначны нулю при работе с ними, словно с числами. Строку сначало надо перевести в число с помощью ''text2num'', и только потом можно будет работать со значением, как с числом. | ||
+ | |||
+ | === num2text === | ||
+ | |||
+ | Команда ''num2text'' - противоположность ''text2num''. Она превращает числовое значение в строку. Этого также можно достигнуть, встраивая символы цифр в строку, но ''num2text()'' обеспечивает больший контроль над тем, как число форматируется. | ||
+ | |||
+ | num2text(Num,SigDigs) | ||
+ | Num – число для записи в строку | ||
+ | SigDigs – количество значащих цифр. | ||
+ | Возвращает новую строку. | ||
+ | |||
+ | Число значащих цифр определяет, когда будут использоваться технические обозначения. Числам стандартно выдаются 6 значащих цифр, так что технический знак будет использоваться только для чисел с 9 и более цифрами. Если вы хотите другого результата, вы можете использовать ''num2text()''. | ||
+ | |||
+ | == Сравнение текстовых цепочек == | ||
+ | |||
+ | Проще всего сравнить две строки путем сравнения их ссылок на данные, с помощью оператора ''==''. Одинаковые строки всегда хранятся в одном месте для сбережения памяти. | ||
+ | |||
+ | Есть несколько специальных команд для сравнения текстовых цепочек, когда вам не подходит точное сравнение. Например, вы не хотите чтобы в сравнении была чувствительность к регистру, или вы хотите знать порядок строк по алфавиту. | ||
+ | |||
+ | === cmptext === | ||
+ | |||
+ | Команда ''cmptext'' выполняет сравнение строк, чувствительное к регистру. | ||
+ | |||
+ | cmptext(Txt1,Txt2,...) | ||
+ | Txt1 – первая строка для сравнения. | ||
+ | Txt2 – вторая строка для сравнения. | ||
+ | Возвращает 1, если одинаковы, и 0, если нет. | ||
+ | |||
+ | === sorttext === | ||
+ | |||
+ | Команда ''sorttext'' используется для определения алфавитного порядка строк. Она не чувствительна к регистру, а вот ''sortText'' делает тоже самое, но с чувствительностью к нему. | ||
+ | |||
+ | sorttext (Txt1,Txt2,...) | ||
+ | sortText (Txt1,Txt2,...) | ||
+ | Txt1 – первая строка для сравнения. | ||
+ | Txt2 – вторая строка для сравнения. | ||
+ | Возвращает 1, если возрастающий порядок, -1, если убывающий, в других случаях 0. | ||
+ | |||
+ | Следующий пример показывает как можно получить алфавитный список игроков. | ||
+ | |||
+ | proc/SortTextList(lst[]) | ||
+ | var/i | ||
+ | var/j | ||
+ | for(i=1,i<=lst.len,i++) | ||
+ | for(j=i+1,j<=lst.len,j++) | ||
+ | if(sorttext(lst[i],lst[j]) == -1) //swap positions | ||
+ | var/tmp = lst[i] | ||
+ | lst[i] = lst[j] | ||
+ | lst[j] = tmp | ||
+ | |||
+ | mob/verb/who() | ||
+ | var/lst[0] | ||
+ | var/mob/M | ||
+ | var/N | ||
+ | for(M) | ||
+ | if(M.client) lst += M.name | ||
+ | SortTextList(lst) | ||
+ | for(N in lst) usr << N | ||
+ | |||
+ | == Текстовые документы == | ||
+ | |||
+ | Строка в DM заключается в одинарные кавычки. Это сделано для коротких текстовых цепочек, состоящих из нескольких слов. Более длинные строки могут вводиться как текстовые документы. Это тоже самое, что и обычные строки, не считая того, что они начинаются с '''"''' и заканчиваются '''"'''. | ||
+ | |||
+ | В то время, как в строках приходится избегать переноса и двойных кавычек, их можно вставлять прямо в текстовый документ. Это поможет вам писать более разборчивый исходный код, когда генерируются многочисленные линии выходных данных в одиночном утверждении. | ||
+ | |||
+ | Следующий пример использует текстовый документ, чтобы написать приветствие игрока. | ||
+ | |||
+ | mob/Login() | ||
+ | . = ..() | ||
+ | usr << {" | ||
+ | |||
+ | The Great BYOND | ||
+ | |||
+ | |||
+ | Welcome, [usr]. I am glad you could join us. | ||
+ | |||
+ | |||
+ | Please refrain from scribbling on the walls. | ||
+ | |||
+ | "} | ||
+ | |||
+ | Очень длинные текстовые цепочки следует помещать в отдельный файл. Однако, как и в этом примере, сообщения, содержащие внедренные выражения, могут аккуратно использоваться с встроенным текстовым документом. |
Версия от 01:12, 13 декабря 2016
Это 15 глава перевода оригинального руководства по Dream Maker от разработчиков.
Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.
Оригинальная 15 глава руководства на английском языке
Глава 15: Работа с текстом
Истинная магия — это изучение высших истин Природы. — Густавус Миллер, Что есть сон.
Строки текста – важная часть почти любого мира. Вы уже видели один хороший метод конструирования текста со встроенными аргументами и форматированием макросов. Есть другие элементарные команды, рассчитанные для работы с текстом. В этой главе мы вам о них и расскажем.
findtext
Команда findtext ищет внутри одной строки текста другую. Эта операция работает без учета регистра, а findText - с учетом. Есть и другие пары команд, следующие такому же принципу: команда, содержащая заглавную букву, учитывает регистр.
findtext(T1,T2,Start=1,End=0) findText(T1,T2,Start=1,End=0) T1 – строка, в которой выполняется поиск. T2 – строка, которую мы ищем. Start – номер символа, с которого начинаем поиск. End – номер символа, на котором мы его заканчиваем. Результатом служит номер первого символа найденной строки. Если искомый текст не найден, то результат будет 0.
0 используется как стандартное значение для обозначения позиции, которой нет. То есть, если поиск не требуется прекращать ни на каком символе, или если строка не найдена.
Пример использования findtext() для поиска в разговоре ключевых слов:
mob/rat verb/tell(msg as text) set src in oview() if(findtext(msg,"cheese")) view() << "[src] looks at [usr] hopefully." walk_to(src,usr)
copytext
Команда copytext копирует кусок строки. Эта команда, и предыдущая findtext то же самое, что и команды copy и find в стандартном текстовом редакторе.
copytext(Txt,Start=1,End=0) Txt – строка из которой мы хотим скопировать часть. Start – номер стартового символа. End – номер символа, на котором нужно остановиться. Возвращает получившуюся строку.
addtext
Команда addtext объединяет две и более строк в одну. Это также можно сделать, вставляя строки одну за другой в другую строку, но когда нужно объединить много значений, проще использовать addtext().
addtext(Txt1,Txt2,...) Возвращает одну строку, полученную путем слияния заданных.
lentext
Команда lentex измеряет количество символов в строке.
lentext(Txt) Txt – строка, длину которой вы хотите узнать. Возвращает число символов в строке.
Изменение текста
Есть несколько операций для изменения формы. Расскажем о каждой из них поподробнее.
uppertext
Команда uppertext переводит любые символы нижнего регистра в верхний регистр.
uppertext(Txt) Txt – текст, который вы хотите изменить. Возвращает полученную строку.
lowertext
Команда lowertext переводит любые символы верхнего регистра в нижний.
lowertext(Txt) Txt – текст, который вы хотите изменить. Возвращает полученную строку.
text2num
Команда text2num переводит строку в числовое значение. Если текст не состоит из символов цифр, то команда вернет 0.
text2num(Txt) Txt – текст, который вы хотите изменить. Возвращает соответствующее число.
Важно знать, что текстовое значение кардинально отличается от числового, даже если визуально они похожи. Если вы попробуете совершить числовые операции со строкой, то у вас ничего не выйдет, потому что все текстовые цепочки и прочие нечисловые значения равнозначны нулю при работе с ними, словно с числами. Строку сначало надо перевести в число с помощью text2num, и только потом можно будет работать со значением, как с числом.
num2text
Команда num2text - противоположность text2num. Она превращает числовое значение в строку. Этого также можно достигнуть, встраивая символы цифр в строку, но num2text() обеспечивает больший контроль над тем, как число форматируется.
num2text(Num,SigDigs) Num – число для записи в строку SigDigs – количество значащих цифр. Возвращает новую строку.
Число значащих цифр определяет, когда будут использоваться технические обозначения. Числам стандартно выдаются 6 значащих цифр, так что технический знак будет использоваться только для чисел с 9 и более цифрами. Если вы хотите другого результата, вы можете использовать num2text().
Сравнение текстовых цепочек
Проще всего сравнить две строки путем сравнения их ссылок на данные, с помощью оператора ==. Одинаковые строки всегда хранятся в одном месте для сбережения памяти.
Есть несколько специальных команд для сравнения текстовых цепочек, когда вам не подходит точное сравнение. Например, вы не хотите чтобы в сравнении была чувствительность к регистру, или вы хотите знать порядок строк по алфавиту.
cmptext
Команда cmptext выполняет сравнение строк, чувствительное к регистру.
cmptext(Txt1,Txt2,...) Txt1 – первая строка для сравнения. Txt2 – вторая строка для сравнения. Возвращает 1, если одинаковы, и 0, если нет.
sorttext
Команда sorttext используется для определения алфавитного порядка строк. Она не чувствительна к регистру, а вот sortText делает тоже самое, но с чувствительностью к нему.
sorttext (Txt1,Txt2,...) sortText (Txt1,Txt2,...) Txt1 – первая строка для сравнения. Txt2 – вторая строка для сравнения. Возвращает 1, если возрастающий порядок, -1, если убывающий, в других случаях 0.
Следующий пример показывает как можно получить алфавитный список игроков.
proc/SortTextList(lst[]) var/i var/j for(i=1,i<=lst.len,i++) for(j=i+1,j<=lst.len,j++) if(sorttext(lst[i],lst[j]) == -1) //swap positions var/tmp = lst[i] lst[i] = lst[j] lst[j] = tmp mob/verb/who() var/lst[0] var/mob/M var/N for(M) if(M.client) lst += M.name SortTextList(lst) for(N in lst) usr << N
Текстовые документы
Строка в DM заключается в одинарные кавычки. Это сделано для коротких текстовых цепочек, состоящих из нескольких слов. Более длинные строки могут вводиться как текстовые документы. Это тоже самое, что и обычные строки, не считая того, что они начинаются с " и заканчиваются ".
В то время, как в строках приходится избегать переноса и двойных кавычек, их можно вставлять прямо в текстовый документ. Это поможет вам писать более разборчивый исходный код, когда генерируются многочисленные линии выходных данных в одиночном утверждении.
Следующий пример использует текстовый документ, чтобы написать приветствие игрока.
mob/Login() . = ..() usr << {" The Great BYOND Welcome, [usr]. I am glad you could join us. Please refrain from scribbling on the walls. "}
Очень длинные текстовые цепочки следует помещать в отдельный файл. Однако, как и в этом примере, сообщения, содержащие внедренные выражения, могут аккуратно использоваться с встроенным текстовым документом.