Vala Types

Vala Типы данных.

Vala Types

Исходники и Компиляция

Ps вам кстати очевидно понадобиться пакет valac для компиляции, есть на всех дистрибутивах. В качестве IDE я пока использую VS Code с плагином для Vala. ( В Sublime тоже есть плагин для Vala)

Код Vala хранится в файлах с расширением .vala. Vala не навязывает такую структуру как язык Java — здесь так же нет концепции пакетов или файлов класса. Вместо структуры, определяемой текстом в отдельных файлах, здесь используются логические конструкции, такие как пространство имен. Во время компиляции Vala кода вы указываете компилятору список необходимых файлов и Vala самостоятельно решит как они должны взаимодействовать.

Это означает, что вы можете использовать столько классов или функций в файле сколько захотите, даже объединяя части разных пространств имен вместе. Конечно, так делать не очень хорошая идея. Есть некоторые соглашения, которым вы, вероятно, захотите следовать. Хорошим примером того, как структурировать проект в Vala является сам проект Vala.

Сама компиляция происходит так, исходники поступают в компилятор в качестве аргументов командной строки:

$ valac твоя_прога.vala --pkg используемые_пакеты

Если поставить ключ -C то вместо бинарника сгенерится код на си, то есть вместо компиляции произойдет только трансляция. Коментарий от разраба:

Если посмотреть на содержание этих файлов, то можно там увидеть что программирование класса на Vala эквивалентно тому же занятию на С, но в целом более кратко. Вы заметите, что класс регистрируется динамически на запущенной системе. И это хороший пример мощи платформы GNOME, но, как я сказал ранее, не нужно столько много знаний, чтобы использовать Vala.

Для подключения си заголовка(дада) нужно воспользоваться ключом -H

$ valac hello.vala -C -H hello.h

ООбзор синтаксиса

Синтаксис Vala является смесью всего, но в большей степени C#. Также для тех кто привык к Python есть второй язык Granie который компилируется тем же компилятором, в такой же код.

В принципе все как в Си/С++ — те же области видимости {}, объявления переменных int i, выделение памяти под объекты: Object o = new Object()// о — ссылка на объект Object

3 типа коментариев, как и везде

Vala разрешает комментирование несколькими способами

// Comment continues until end of line

/* Comment lasts between delimiters */

/**
 * Documentation comment
 */

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

Автогенерировать документацию для Vala умеет Valadoc ^^

ТТипы данных

VValue-типы

Vala поддерживает множество простых типов, как и многие другие языки:

  • Байт, char, uchar; они названы char по историческим причинам.
  • Символ, unichar; 32-битный символ Юникод
  • Целый, int, uint
  • Длинный целый, long, ulong
  • Малый целый, short, ushort
  • Int с гарантированным размером, int8, int16, int32, int64 также и беззнаковые uint8, uint16, uint32, uint64. Номера показывают длинну в битах.
  • Число с плавающей точкой, float, double
  • Булев, bool; возможные значения true и false
  • Составной, struct
  • Перечисление, enum; представленное целыми значениями, а не классами, как перечисления в Java

Большинство этих типов могут иметь разные размеры в засимости от платформы, размер гарантирован только для целочисленных.

ССтроки

Тип данных для строки является string. Строки Vala кодируются в UTF-8 и неизменяемы.(Причины описаны в предыдущей статье)

string text = "Это строка";

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

как видно даже анализатор кода не понимает что это возможно и считает что verbatim string находиться не в кавычках.

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

А теперь уже совсем магия. Думаю многие как и я обожают когда вывод в консоль или куда либо еще производиться очень легко, ведь он довольно часто нам нужен. Как раз такой имелся в С++, там используя namespace std мы могли выводить строки в консоль так:

cout<<"строка" << переменная любого типа без указания ее типа!! << что угодно;

И в тоже время в Си мы имеем чертов printf, который лично я нинавижу, хоть он и довольно типо-безопасный(также существуют более безопасные функции вывода)Доп знания{[(Многие функции семейства printf называются «небезопасными», так как они не имеют даже теоретической возможности для защиты от некорректных данных, а также ограничений по максимальному размеру, что на изи может привести к любимому сишниками переполнению буфера.)]}. Юзается так:

        int n = 7;
	float p = 12.75;
	int cost = 7800;
	printf("%d участников соревнований съели %f пирожков с вишнями.\n", n, p);
	printf("Значение pi равно %f\n", PI);
	printf("До свидания! Ваше искусство слишком дорого обходится (%c%d)\n", '$', 2 * cost);

Что я считаю жутко неудобным и долгим) Возможно многие со мной не согласятся. (Для тех кто так и не понял, printf принимает 2 аргумента, в первом мы пишем строку в которой такжу учавствуют переменные %d/%s/%f для каждого типа соответственно, а все оставшиеся аргументы являются названиями переменных, которые затем встанут на места %d/%f в той же последовательности)

Так вот, в Vala существует такая классная штука как собака, которая превращает строку в шаблон, и мы имеем новый способ вывода, который похож на смесь двух предыдущих:

int a = 6, b = 7;
string s = @"$a * $b = $(a * b)";  // => "6 * 7 = 42"

Тоесть да, переменные подставляются прямо в нужные места в строку, и нам как и в C++ не нужно указывать их типы.И в них даже можно выполнять инструкции!

Это, просто, ахренительно.

Операторы сравнения == и != сравнивают содержание двух строк, в отличии от Жабы, в которой в этом случае сравнятся ссылки объектов.(для сравнивания строк в C++/C/Жабе существует отдельная метод equals String(«test»).equals(«test»))

Вот пример кода в котором я использую все что описал выше, verbatim строки, и ВЫЧИСЛЕНИЯ ПРЯМО В ВЫВОДЕ, да это же почти лямбда-функции, но в строке, омг.

Фух, идем дальше, помните срезы из прошлой статьи, это они:

string greeting = "hello, world";
string s1 = greeting[7:12];        // => "world"
string s2 = greeting[-4:-2];       // => "or"

Отрицательные числа — относительные позиции от конца строки.

Кстати, индексы в Vala начинаются с 0 как и в большинстве других языков. Можно получить доступ к одиночному байту строки с помощью [index]:

uint8 b = greeting[7];             // => 0x77

Однако вы не можете вставить другой байт на это место, так как Vala строки неизменяемы(тк кк уже 3 раза упоминалось — они напрямую написаны в кодировке UTF-8 это автоматически защищает от любых проблем с кодировкой, но тк кк в это кодировке разные симовлы занимают разное кол во памяти — редактить их невозможно)

Переменные можно очень легко парсить в строки, Ога.

вы тоже не согласны с цитатой?

Советую разобраться в верхнем коде, парсинг это весело(особенно пришедшего с jбилинга jsona)

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

Кстати с помощью in можно определять содержит ли одна строка другую:

if ("pass" in "login:rar pass:sass") ...

Строки можно складывать:

    string a = "Concatenated ";
    string b = "string";
    string c = a + b;
    println (c);

Строки можно хитро, эмм, более хитро складывать с помощью stringBuilder:

var builder = new StringBuilder ();
    builder.append ("built ");
    builder.prepend ("String ");
    builder.append ("StringBuilder");
    builder.append_unichar ('.');
    builder.insert (13, "by ");
    println (builder.str); // => "String built by StringBuilder."

Это уже точно никому не понадобится но в строки можно вставлять переменные при создании:

string formatted = "PI %s equals %g".printf ("approximately", Math.PI);
    println (formatted);

Строки можно быстро лексикографически сравнить:

if ("blue" < "red" && "orange" > "green") { }
        // это тру

Для строк можно применять различные операции. Вот несколько из них:

    println ("от нижнего регистра к верхнему".up ());
    println ("reversed string".reverse ());
    println ("...подстрока...".substring (3, 9));

Также тут есть регулярные выражения:

тут мы заменили всех из семейства кошачих на котят

С длинной строк Vala очевидно не все так просто(они в юникоде)

До версии 0.11 было так

string dessert = "crème brûlée";
assert (dessert.length == 12);
assert (dessert.size () == 15);

.size и .leight выдавали разные значения. Но после 0.11 .length выдает длинну основываясь на байтах.

string dessert = "crème brûlée";
assert (dessert.length == 15);
uint8 a_byte = dessert[3];
assert (a_byte == 0xA8);

Перевод комента от разрабов:

Обратите внимание, что строки в Vala все еще UTF-8, ничего не изменилось в этом отношении. Разница заключается в том, что индексы / смещения / длины измеряются в единицах кода (байты, поскольку мы говорим о UTF-8) вместо кодовых точек.Это соответствует строковым API-интерфейсам во многих библиотеках (Java, .NET, Qt, Go) и позволяет повысить производительность при обработке строк, не прибегая к указателям все время, сохраняя при этом правильную поддержку строк Unicode.Единица кодовой точки Unicode не очень значима в большинстве контекстов, поскольку это не то же самое, что глиф. См. Эту статью для разницы между юникодными единицами, кодовыми точками и глифами.

Разработчики C # и Java должны обратить внимание, потому что Java String.length и .NET String.length подсчитывает единицы кода UTF-16, каждый из которых занимает 2 байта, а Vala подсчитывает единицы кода UTF-8, каждый из которых занимает 1 байт. Например, строка «𐌆𐌕 𐌋𐌏𐌏𐌊𐌔 𐌋𐌉𐌊𐌄 𐌓𐌖𐌍𐌄𐌔» содержит 20 кодовых точек (что большинство программистов называют «символы»), а длина 35 в .Net / Java и 67 в Vala, занимая соответственно 70 и 67 байт. Поскольку большинство используемых кодовых точек принимают 1 кодовый блок UTF-16, это приводит к ошибочному представлению о том, что строки C # и Java подсчитывают символы.

Так как же нам теперь итерировать по строке? Вот так:

Пока что все, чето слишком много вышло, придется тоже эту разбить на 2.

Войти с помощью: 
avatar
5000