Что является литералом строкового значения
На прошлом уроке выводили строку, а если говорить более формальным языком, то так называемый строковый литерал.
MySQLSELECT "Hello world"
Литерал — это указанное явным образом фиксированное значение, например, число 12 или строка "SQL" .
Основными типами литералов в MySQL являются:
- строковый
- числовой
- логический
- NULL
- литерал даты и времени
Строка — это последовательность символов, заключённых в одинарные (') или двойные (") кавычки. Например, 'это строка' и "это строка" .
Строки могут содержать специальные последовательности символов, начинающиеся с "\" (экранирующий символ). Они нужны для того, чтобы СУБД придала обычным символам (буквам и другим знакам) новое особое значение. Например, последовательность "\n" буквально означает "перевод строки", а без предваряющего слеша это была бы обычная буква "n" .
MySQLSELECT "Строка Другая строка" as String
String Строка Другая строка MySQLSELECT "Строка \n Другая строка" as String
String Строка Другая строка
Пример Включает в себя целые и дробные числа. Разделительный знак для дробного числа — «.» (точка). 1 , 2.9 , 0.01 Может иметь только целую, дробную часть или обе сразу. .2 , 1.1 , 10 Может быть положительным и отрицательным числом (для положительного числа совсем не обязательно указывать знак). +1 , -10 , -2.2 Могут быть представлены в экспоненциальном виде. 1e3 (=1000) 1e-3 (=0.001) Для числовых литералов в SQL есть все привычные нам арифметические операторы:
Оператор Описание Пример % , MOD Деление по модулю 11 % 5 = 1 * Умножение 10 * 16 = 160 + Сложение 98 + 2 = 100 - Вычитание 50 - 51 = -1 / Деление 1 / 2 = 0.5 DIV Целочисленное деление 10 DIV 4 = 2 Используя эти операторы можно построить любое арифметическое выражение, применяя стандартные правила арифметики.
MySQLSELECT (5 * 2 - 6) / 2 AS Result;
Значения даты и времени могут быть представлены в формате строки или числа.
Например, если мы хотим указать какую-то дату в запросе, то мы можем это сделать с помощью строки "1970-12-30" , "19701230" или же числа 19701230 . В обоих случаях эти значения будут интерпретироваться как дата «30 декабря 1970 года».
Ниже приведён пример использования литерала даты:
MySQLSELECT * FROM FamilyMembers WHERE birthday > '1970-12-30'
Можете не обращать внимание на то, что конкретно делает данный запрос, мы это рассмотрим попозже. Сейчас нам важен именно синтаксис того, как мы можем указывать дату в запросе.
Кроме самой даты, мы можем также указывать отдельно время или же всё вместе.
Описание Формат Дата Интерпретируется как дата со временем, равным нулю YYYY-MM-DD , YYYYMMDD Вместо разделителя "-" можно использовать любой знак препинания.
Разделитель тоже можно опустить.
Строковые литералы
В C# поддерживается еще один тип литералов — строковый. Строковый литерал представляет собой набор символов, заключенных в двойные кавычки. Например, следующий фрагмент кода:
представляет собой текстовую строку. Образцы подобных строк не раз встречались в приведенных выше примерах программ.
Помимо обычных символов, строковый литерал может содержать одну или несколько управляющих последовательностей символов, о которых речь шла выше. Рассмотрим для примера программу, в которой используются управляющие последовательности \n и \t .
// Продемонстрировать применение управляющих // последовательностей символов в строковых литералах. using System; class StrDemo < static void Main() < Console.WriteLine("Первая строка\nВторая строка\nТретья строка"); Console.WriteLine("Один\nДва\nТри"); Console.WriteLine("Четыре\tПять\tШесть"); // Вставить кавычки. Console.WriteLine(@""3ачем?", спросил он."); >>
Результат выполнения этой программы приведен ниже.
Первая строка Вторая строка Третья строка Один Два Три Четыре Пять Шесть "Зачем?", спросил он.
В приведенном выше примере программы обратите внимание на то, что для перехода на новую строку используется управляющая последовательность \n . Для вывода нескольких строк совсем не обязательно вызывать метод WriteLine() несколько раз — достаточно вставить управляющую последовательность \n в тех местах удлиненной текстовой строки (или строкового литерала), где должен происходить переход на новую строку. Обратите также внимание на то, как в текстовой строке формируется знак кавычек.
Помимо описанной выше формы строкового литерала, можно также указать буквальный строковый литерал. Такой литерал начинается с символа @ , после которого следует строка в кавычках. Содержимое строки в кавычках воспринимается без изменений и может быть расширено до двух и более строк. Это означает, что в буквальный строковый литерал можно включить символы новой строки, табуляции и прочие, не прибегая к управляющим последовательностям. Единственное исключение составляют двойные кавычки ( " ), для указания которых необходимо использовать две двойные кавычки подряд ( "" ). В приведенном ниже примере программы демонстрируется применение буквальных строковых литералов.
// Продемонстрировать применение буквальных строковых литералов, using System; class Verbatim < static void Main() < Console.WriteLine(@"Это буквальный строковый литерал, занимающий несколько строк. "); Console.WriteLine(@"А это вывод с табуляцией: 1 2 3 4 5 6 7 8 "); Console.WriteLine(@"Отзыв программиста: ""Мне нравится С#."""); >>
Результат выполнения этой программы приведен ниже.
Это буквальный строковый литерал, занимающий несколько строк. А это вывод с табуляцией 1 2 3 4 5 6 7 8 Отзыв программиста: "Мне нравится С#."
Следует особо подчеркнуть, что буквальные строковые литералы выводятся в том же виде, в каком они введены в исходном тексте программы.
Преимущество буквальных строковых литералов заключается в том, что они позволяют указать в программе выводимый результат именно так, как он должен выглядеть на экране. Но если выводится несколько строк, то переход на новую строку может нарушить порядок набора исходного текста программы с отступами. Именно по этой причине в примерах программ, приведенных в этом курсе, применение буквальных строковых литералов ограничено. Тем не менее они приносят немало замечательных выгод во многих случаях, когда требуется форматирование выводимых результатов.
И последнее замечание: не путайте строки с символами. Символьный литерал, например 'X' , обозначает одиночную букву типа char . А строка, состоящая из одного символа, например "X" , по-прежнему остается текстовой строкой.
Документация
Вы можете включить предопределенные String значения в вашем коде как строковые литералы. Строковый литерал — это фиксированная последовательность текстовых символов, окруженная парой двойных кавычек ( «» ).
Используйте строковый литерал как начальное значение для константы или переменной:
let someString = "Some string literal value"
Заметьте, что Swift вывел тип String для константы someString , потому что он был инициализирован строковым литеральным значением.
Заметка
Для получения информации об использовании специальных символов в строковых литералах, смотрите главу Специальные Unicode символы в строковых литералах.
Многострочные литералы строк
Если вам нужно создать строку, которая поддерживает многострочный вид, используйте литерал многострочной строки — последовательность символов, обернутых в три двойные кавычки:
let quotation = """ The White Rabbit put on his spectacles. "Where shall I begin, please your Majesty?" he asked. "Begin at the beginning," the King said gravely, "and go on till you come to the end; then stop." """
Многострочный литерал строки включает в себя все строки между открывающими и закрывающими кавычками. Строка начинается на первой строке после открывающих кавычек ( «»» ), а заканчивается на строке предшествующей закрывающим кавычкам, что означает, что ни одна из строк ниже ни начинается, ни заканчивается символом переноса строки:
let singleLineString = "These are the same." let multilineString = """ These are the same. """
Когда ваш исходный код включает в себя символ переноса строки внутри литерала многострочной строки, то этот символ переноса строки так же появляется уже внутри значения этой строки. Если вы хотите использовать символ переноса строки для того, чтобы сделать ваш код более читаемым, но вы не хотите чтобы символ переноса строки отображался в качестве части значения строки, то вам нужно использовать символ обратного слеша ( \ ) в конце этих строк:
let softWrappedQuotation = """ The White Rabbit put on his spectacles. "Where shall I begin, \ please your Majesty?" he asked. "Begin at the beginning," the King said gravely, "and go on \ till you come to the end; then stop." """
Для того, чтобы создать литерал строки, который начинается и заканчивается символом возврата каретки (\r), напишите пустую строчку в самом начале и в конце литерала строки, например:
let lineBreaks = """ This string starts with a line break. It also ends with a line break. """
Многострочная строка может иметь отступы для соответствия окружающему ее коду. Пробел до закрывающей группы двойных кавычек ( «»» ) сообщает Swift, сколько пробелов нужно игнорировать в начале каждой строки. Если же вы напишите дополнительные пробелы напротив какой-либо строки к тем, которые стоят напротив закрывающих кавычек, то эти дополнительные пробелы уже будут включены в значение строки.
let linesWithIndentation = """ Эта строка начинается без пробелов в начале. Эта строка имеет 4 пробела. Эта строка так же начинается без пробелов. """
В примере выше, не смотря на то, что весь литерал многострочной строки имеет отступ, первая и последняя строка будут начинаться без пробелов. Средняя же строка будет иметь отступ, так как она начинается с дополнительными четырьмя пробелами относительно закрывающей группы двойных кавычек.
Специальные символы в строковых литералах
Строковые литералы могут включать в себя следующие специальные символы:
- экранированные специальные символы \ 0 (нулевой символ), \\ (обратный слэш), \t (горизонтальная табуляция), \n (новая строка), \r (возвращение каретки), \ «(двойные кавычки) и \’ (одиночные кавычки )
- Произвольные скалярные величины Юникода, записанные в виде \u , где n — 1-8 значное шестнадцатиричное число со значением, равным действительной точке кода Юникода.
Приведенный ниже код показывает все эти четыре примера специальных символов. wiseWords константа содержит два экранированных символа: двойные кавычки. DollarSign , blackHeart , и sparklingHeart константы показывают скалярный формат Юникода:
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein" // "Imagination is more important than knowledge" - Einstein let dollarSign = "\u" // $, Unicode scalar U+0024 let blackHeart = "\u" // ♥, Unicode scalar U+2665 let sparklingHeart = "\u" // ?, Unicode scalar U+1F496
Так как многострочные строки имеют три двойные кавычки вместо одной, то вы можете включить двойную кавычку внутрь многострочной строки без знака экранирования. Для того, чтобы включить символы «»» в многострочную строку, вам нужно экранировать хотя бы одну из кавычек, например:
let threeDoubleQuotes = """ Escaping the first quote \""" Escaping all three quotes \"\"\" """
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Литералы¶
Литералы - это фиксированные значения, которые являются примитивами JavaScript.
Строковые литералы¶
Вы можете использовать строковый литерал в качестве типа. Например:
let foo: 'Hello';
Здесь мы создали переменную с именем foo , которая позволяет присваивать ей только литеральное значение 'Hello' . Это продемонстрировано ниже:
let foo: 'Hello'; foo = 'Bar'; // Ошибка: "Bar" нельзя назначить типу "Hello"
Они не очень полезны сами по себе, но могут быть собраны в тип объединение для создания мощной (и полезной) абстракции, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15type CardinalDirection = | 'North' | 'East' | 'South' | 'West'; function move( distance: number, direction: CardinalDirection ) // . > move(1, 'North'); // Okay move(1, 'Nurth'); // Ошибка!
Другие литеральные типы¶
TypeScript также поддерживает литеральные типы boolean и number , например:
type OneToFive = 1 | 2 | 3 | 4 | 5; type Bools = true | false;
Логический вывод¶
Как правило, вы получаете сообщение об ошибке: Тип string не может быть назначен для типа "foo" . Следующий пример демонстрирует это.
1 2 3 4 5 6function iTakeFoo(foo: 'foo') <> const test = someProp: 'foo', >; iTakeFoo(test.someProp); // Ошибка: Аргумент типа string не может быть // назначен параметру типа 'foo'
Это потому, что test подразумевает тип . Решением в этом случае было бы использование простого утверждения типа. Для того чтобы сообщить TypeScript литерал, который вы хотите, чтобы он выводил, как показано ниже:
1 2 3 4 5function iTakeFoo(foo: 'foo') > const test = someProp: 'foo' as 'foo' >; iTakeFoo(test.someProp); // Okay!
или используйте описание типа, которое поможет TypeScript понять правильный тип в точке объявления:
1 2 3 4 5 6 7 8 9function iTakeFoo(foo: 'foo') <> type Test = someProp: 'foo', >; const test: Test = // Пометки - подразумевается, что someProp всегда === 'foo' someProp: 'foo', >; iTakeFoo(test.someProp); // Okay!
Случаи использования¶
Возможные варианты использования для строковых литералов:
Тип перечисление на основе строк¶
Тип перечисление в TypeScript основан на числах. Вы можете использовать строковые литералы вместе с объединенными типами, чтобы сымитировать перечисление на основе строки, как мы это делали в примере CardinalDirection выше. Вы даже можете сгенерировать структуру Key: Value , используя следующую функцию:
1 2 3 4 5 6 7 8 9/** Утилита для создания K:V из списка строк */ function strEnumT extends string>( o: ArrayT> ): [K in T]: K > return o.reduce((res, key) => res[key] = key; return res; >, Object.create(null)); >
А затем сгенерируйте тип объединение из литеральных типов, используя keyof typeof . Вот полный пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32/** Утилита для создания K:V из списка строк */ function strEnumT extends string>( o: ArrayT> ): [K in T]: K > return o.reduce((res, key) => res[key] = key; return res; >, Object.create(null)); > /** * Пример создания типа объединение на основе строк */ /** Создать K:V */ const Direction = strEnum([ 'North', 'South', 'East', 'West', ]); /** Создать тип */ type Direction = keyof typeof Direction; /** * Пример использования типа объединение на основе строк */ let sample: Direction; sample = Direction.North; // Okay sample = 'North'; // Okay sample = 'AnythingElse'; // ОШИБКА!
Моделирование имеющихся JavaScript API¶
Например В редакторе CodeMirror есть опция readOnly , которая может быть либо boolean , либо литеральной строкой "nocursor" (валидные допустимые значения true,false,"nocursor" ). Это может быть объявлено как:
readOnly: boolean | 'nocursor';