Форум русскоязычного сообщества Ubuntu


За новостями русскоязычного сообщества и Ubuntu в целом можно следить на нашей страничке в Google+

Автор Тема: Уроки и примеры по ЯП-у Vala  (Прочитано 11520 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
« Последнее редактирование: 11 Декабрь 2016, 01:15:02 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Установка компилятора и первая программа
« Ответ #1 : 02 Февраль 2014, 20:02:20 »
В кратце о компиляторе: код на Vala сначала транслируется(переводится) на C, а потом код на C компилируется(превращается в исполнительный файл). В отличии от C подобных языков код Vala значительно проще, удобнее для восприятия. Например, нам не нужно вручную управлять памятью, следовательно для программирования на Vala вам потребуется гораздо меньше опыта. Кроме того в отличии от Java и Python программа выполняется гораздо быстрее посколюку она она не транслируется,  компилируется. А поскольку Vala основан на C он имеет такую же мощь как C или C++(если вы помните сначала код с C++ транслировался на C, потом появился отдельный компилятор). Поддерживается ООП, однако намного проще чем C++.
Переходим к практике: ставим компилятор-транслятор.

В любимом редакторе набираем код:
Код: Vala
  1. int main() // С этой строки начинается выполнение программы
  2. {   // Код в функции между фигурными скобками
  3.     /* Код между 2 наклоненными линями или слешем(наклоненая линия) и
  4.     звездочкой это комментарий. В первом случае комментарий до конца
  5.     строки,во втором до звездочки и слеша. На работу не влияют, нужны для
  6.     понимания кода*/
  7.     // выводим на экран строку
  8.     stdout.printf("Привет, как тебя зовут? ");
  9.     /* Ждем ввода пользователя, сохраняем его в
  10.     переменной imya типа string
  11.     Переменные начинаются с латинской буквы,
  12.     далее разрешены цифры, подчеркивание*/
  13.     string imya = stdin.read_line();
  14.     // Знакомый вывод. Символ @ позволяет подставлять значения переменных
  15.     //Для этого перед именем переменной ставим символ $
  16.     stdout.printf(@"Привет $imya\n");
  17.     //Завершаем работу процедуры(в данном случае программы)
  18.     // ноль означает отсутствие ошибок
  19.     return 0;
  20. }
И сохраняем в любом файле с расширением .vala. Например v1.vala
Компилируем: valac v1.vala Ошибок нет? Запускаем: ./v1 Сохраняем исполняемый файл с другим именем: valac -o v2 v1.valaТранслируем в код на C(обратите внимание не C++): valac -C v1.vala Создаем объектный файл:valac -c v1.vala Получаем заголовочный файл: valac -H v1.vala Компиляция и запуск - самые нужные команды. Если не знаете зачем нужны остальные команды - значит они вам и не нужны.
А вот пример работы программы:
alsoijw@alsoijw-Aspire-4315 ~/Документы/vala $ ./v2
Привет, как тебя зовут?
alsoijw
Привет alsoijw
И еще один приятный момент - у Vala и его близкого родственника Genie есть интерпретатор, который сначала транслирует код и сохраняет его во временной папке, а потом запускает его. Вот пример его работы
alsoijw@alsoijw-Aspire-4315 ~/Документы $ vala 1.vala
/tmp/1.vala.OCGDBX.c: В функции «main»:
/tmp/1.vala.OCGDBX.c:171:2: предупреждение: «g_type_init» is deprecated (declared at /usr/include/glib-2.0/gobject/gtype.h:669) [-Wdeprecated-declarations]
SuperClass.method_1()
SubClass.method_1()
alsoijw@alsoijw-Aspire-4315 ~/Документы $ ./1
bash: ./1: Нет такого файла или каталога
alsoijw@alsoijw-Aspire-4315 ~/Документы $
« Последнее редактирование: 01 Июнь 2014, 23:13:47 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Переменные и математика
« Ответ #2 : 03 Февраль 2014, 20:48:45 »
Пожалуй следующая жизненно важная тема - это переменные. К этой теме мы будем еще не раз обращаться.
После чего мы сможем пользоваться переменной? После обновления. Как это сделать? Синтаксис такой:
Код: Vala
  1. ImyaTipa peremennaya;
Вы видите точку с запятой? Не забывайте про нее. Предположим нам  нужна переменная Int типа int
Код: Vala
  1. int Int;
Как видим Vala различает переменные не только по написанию, но и по регистру.
Как что-то сохранить в переменной?
Код: Vala
  1. ImyaTipa = Znachenie;
Значением может быть любое значение того же типа. Но если типы разные, и преобразовать из одного типа в другой нельзя, тогда будет выброшено исключение, и программа завершит работу. Попозже мы поговорим о других типах. А пока знакомимся с новым типом - целочисленная переменная -
Код: Vala
  1. int
. В ней могут хранится разные целые числа. Дробная часть отбрасывается. Правда слишком большие числа в него не влезут, но позже мы узнаем как это решить. Второй тип - числа с плавающей точкой
Код: Vala
  1. double
Из одного в другой эти числа преобразуются без проблем, но при присвоении числу типа int дробного значения дробная часть "теряется". Если вам кажется что числа типа int непрактичны, то вы удивитесь узнав что у них "другое назначение", не такое как у double. Например они нужны в счетчиках.
И в заключение: в строке может содержаться число, но умножать или складывать строки как числа нельзя. Вот мы извлекаем из строки число, превращаем число в строку. Если преобразовать нельзя(например в числе буква или это не число, а слово) то тогда переменная приравнивается к нулю.
Код: Vala
  1. bool b = bool.parse("false");
  2. int i = int.parse("-52");
  3. double d = double.parse("6.67428E-11");
  4. string s1 = true.to_string();
  5. string s2 = 21.to_string();
Правда я еще ничего не сказал про тип bool, но думаю это тема следующего урока.
А теперь вернемся к математике. Вот делим, умножаем, складываем, вычитаем
Код: Vala
  1. double a, b; // Можно объявлять и так, чтоб не писать кучу раз тип
  2. a = 5;
  3. b = 2;
  4. stdout.printf((a/b).to_string() + "\n");
  5. //Вручную переводим в строку, а то компьютер не догадается
  6. //+ "\n"добавляем к строке символ переноса каретки, чтоб было красиво
  7. stdout.printf((a*b).to_string() + "\n");
  8. stdout.printf((a+b).to_string() + "\n");
  9. stdout.printf((a-b).to_string() + "\n");
Можно и сохранить в какой то переменной
Код: Vala
  1. double c = a + b;
Помните тип int не предназначен для математических расчетов, его цель другая. Если делить два числа типа int мы теряем дробную часть. Чтоб этого не произошло надо преобразовать int в double.
Код: Vala
  1. int a = 5, b = 2;
  2. double c = (double)a/c //c = 2.5
  3. //(тип)переменная нужно для преобразования переменная в тип
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Куда же без логики
« Ответ #3 : 05 Февраль 2014, 17:56:16 »
Как я и обещал, сейчас мы поговорим о логике. Булевая переменная может хранить только два значения.
Код: Vala
  1. bool BoolVar; // Объявляем булевую переменную. Значение по умолчанию - true
  2. BoolVar = true; BoolVar = false //Соответственно правда и ложь
Теперь мы можем управлять выполнением программы
Код: Vala
  1. if (условие) { операторы }//эта часть быть обязана
  2. else if (условие) { операторы } // Может использоваться несколько раз, необязательна
  3. // В отличии от предыдущих - выполняется всегда, если ни одно из предыдущих не выполнилось
  4. else { операторы }
Если блок операторов состоит из одой команды - ставить скобки не обязательно.
А теперь поговорим об условиях. Операции сравнения
Код: Vala
  1. a < b
  2. a > b //Это я думаю вам понятно
  3. a >= b //больше или равно
  4. a <= b //меньше или равно
  5. a != b //не равно
  6. a == b //равно
Однако иногда нам нужно объединять или превращать в противополжное условия
Код: Vala
  1. !a //не - меняет значение на противоположное
  2. a && b //и - истина только если и тот и другой операнд - истина
  3. a || b //или - истина если хотя бы один операнд - истина
  4. a ^ b //исключающее или - истина если операнды не равны
И на конец оператор выбирающий один вариант из нескольких значений одной переменной
Код: Vala
  1. switch (a) //выбираем переменную для анализа
  2. {
  3. case 1://выбираем требуемое значение
  4.     операторы
  5.     break;
  6.     // Не забываем про эту строку, без нее не откомпилируется
  7.     // Она говорит о том что этот вариант закончился
  8.     // и далее начнется следующее условие.
  9. case 2:break;
  10. case 3:
  11.     операторы
  12.     break;
  13. default://если ни одно из условий не оказалось истинным
  14.     операторы
  15.     break;
  16. }
Да и напоследок: vala не позволяет перепутать присвоение = и  равенство ==. Удобнее чем C++.
« Последнее редактирование: 09 Февраль 2014, 19:01:54 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Знакомство с ООП
« Ответ #4 : 06 Февраль 2014, 19:45:41 »
Да пожалуй без ООП далеко не уедешь. В самом начале мы создадим очень простой класс
Код: Vala
  1. public class TestClass1 //Так объявляется новый класс
  2. {
  3.     public void test_metod()
  4.     {
  5.         print ("hello, world\n");
  6.     }
  7. }
Сам по себе этот код работать не будет, но если создать экземпляр этого класса - то мы сможем использовать код этого класса. В функции main создаем переменную типа TestClass1. Думаю вы уже поняли как это сделать
Код: Vala
  1. int main()
  2. {
  3.     TestClass1 Var; // Объявляем переменную только что созданного типа
  4.     Var = new TestClass1(); // Создаем переменную только что созданного типа
  5.     Var.test_metod(); /* Используем функцию этого объекта или попросту метод
  6.     после имени функции идут скобки*/
  7.     return 0;
  8. }
Вы сохранили этот код в одном файле? Да сейчас мы можем это делать, но в больших программах хранить весь исходный код в одном файле неудобно. Если вы изучали C или C++ то уже думаете: будем создавать заголовочный файл. Но это делать не нужно. Более того, если код в таком виде сохранить в разных файлах, то для их компиляции не потребуется импортирования, подключения...(это для тех кто знает что это такое)
Как откомпилировать? Не вносите ни каких дополнительных изменений, просто скопируйте и сохраните в разных файлах. А теперь в терминале вводим:
Код: Bash
  1. valac v1.vala v2.vala -o v
Предполагается что в папке есть файлы v1.vala v2.vala. Обратите внимание, ключ -o обязателен, далее имя бинарного файла. Запускаемalsoijw@alsoijw-Aspire-4315 ~/Документы/vala/новая папка $ ./v
hello, world
alsoijw@alsoijw-Aspire-4315 ~/Документы/vala/новая папка $
Гениально работает! Напоследок о методах, и переменных класса. В классе могут быть свои переменные. Модифицируйте файл с кодом класса, и посмотрите как это работает. В заключение скажу что переменных и методов может быть много. Подробнее поговорим о них позже.
Код: Vala
  1. public class veryimpotant1
  2. {
  3.     public int t;
  4.  
  5.     public void temp()
  6.     {
  7.         t = 5;
  8.         print (@"hello, world$t\n");
  9.     }
  10. }
Теперь создав экземпляр класс мы можем обращаться к переменной t.
Код: Vala
  1. int main()
  2. {
  3.     TestClass1 Var;
  4.     Var = new TestClass1();
  5.     print (Var.t.to_string()); // После переменных скобки не нужны
  6.     return 0;
  7. }
« Последнее редактирование: 25 Февраль 2014, 20:01:52 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Наследование и интерпретатор для Vala
« Ответ #5 : 25 Февраль 2014, 00:12:15 »
Сейчас вкратце рассмотрим наследование.
Код: Vala
  1. public class SuperClass
  2. {
  3.     public void Method()
  4.     {
  5.         stdout.printf ("SuperClass\n");
  6.     }
  7. }
  8.  
  9. public class SubClass : SuperClass
  10. {
  11.    
  12. }
  13.  
  14. void main()
  15. {
  16.     var S = new SubClass();
  17.     // Если при создании переменой транслятор может
  18.     // Определить тип - не обязательно его указывать полностью
  19.     // Это короче чем и красивее SubClass S = new SubClass();
  20.     S.Method();
  21. }
  22.  
  23.  
Мы видим - производный класс может работать с элементами суперкласса.
А вот пример переопределения метода
Код: Vala
  1. class SuperClass : GLib.Object
  2. {
  3.     public void Method()
  4.     {
  5.         stdout.printf("SuperClass.method_1()\n");
  6.     }
  7. }
  8.  
  9. class SubClass : SuperClass
  10. {
  11.     public void Method()
  12.     {
  13.         stdout.printf("SubClass.method_1()\n");
  14.     }
  15. }
  16.  
  17. void main()
  18. {
  19.     var S = new SubClass();
  20.     var S1 = new SuperClass();
  21.     S1.Method();
  22.     S.Method();
  23. }
Класс от которого унаследован данный класс принято называть суперклассом, унаследовавший - субклассом.
« Последнее редактирование: 01 Июнь 2014, 23:08:38 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Передача аргументов по значению и по ссылке
« Ответ #6 : 28 Февраль 2014, 20:06:25 »
В этом уроке мы немного поговорим об аргументах методов(функций). Как известно, каждой функции при ее вызове можно передать какую-то информацию с помощью аргументов. Однако функция может их не только прочитать, но и изменить их. Чтобы понять это запустите пример
Код: Vala
  1. void main()
  2. {
  3.     int a = 0;
  4.     stdout.printf(@"$a\n");
  5.     ByVal(a);
  6.     stdout.printf(@"$a\n");
  7.     //Если переменная предается по ссылке
  8.     //надо не забыть написать ref
  9.     ByRef(ref a);
  10.     stdout.printf(@"$a\n");
  11. }
  12.  
  13. void ByRef(ref int a)
  14. //Переменная передается по ссылке
  15. {
  16.     a = 7;
  17. }
  18.  
  19. void ByVal(int a)
  20. //Переменная передается по значению
  21. {
  22.     a = 7;
  23. }
  24.  
А вот результат ее работы0
0
7
Как мы видим при передаче переменной по ссылке мы можем менять ее значение в вызвавшем ее коде. Понятное дело что и в той и в другой функции после операторов присваивания значение переменной изменилось. но при передаче переменной по значению создается копия переменной, а к оригиналу функция доступа не имеет.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Вкратце о массивах
« Ответ #7 : 25 Март 2014, 17:36:13 »
Итак в этом уроке рассмотрим создание массивов.
Простым языком - это несколько элементов под одним именем, доступ к любому элементу можно получить по номенру.
Их можно создавать несколькими способами.
Код: Vala
  1. int[] a = new int[10];//Во вторых скобочках указываем число элементов
  2. int[] b = { 2, 4, 6, 8 };
  3. a[3]=6;//Обращаемся к 3 элементу
  4. stdout.printf(a[3].to_string());
  5. stdout.printf(a.length);//Узнаем количество элементов
  6. foreach (int a_v in a) { stdout.printf("%d\n", a_v); }//Самый простой метод перебрать все элементы
  7. a.resize(12);//Изменяем размер
И важное предупреждение: если вы случайно обратитесь к не существующему элементу - вас не кто не остановит. Хорошо если только прочтет, а если измените - может вызвать проблемы
« Последнее редактирование: 02 Июнь 2014, 10:16:03 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
циклы for и ключи
« Ответ #8 : 22 Апрель 2014, 22:10:18 »
В этом уроке мы рассмотрим работу цикла, и получение аргументов при запуске программы.
Код: Vala
  1. void main()
  2. {
  3.         for (int a = 0; a < 10; a+=2)
  4.         //сначала инициализируем счетчик, но он может быть объявлен и ранее см 2 пример
  5.         //второе - условие завершения работы цикла
  6.         //насколько увеличивать значение каждый раз
  7.         {
  8.                 stdout.printf("%d\n", a);
  9.         }
  10. }

Код: Vala
  1. void main(string[] args)
  2. {
  3.         int a;
  4.         for (a = 0; a < 10; a++)
  5.         {
  6.                 stdout.printf("%d\n", a);
  7.         }
  8. }
Аргументы передающиеся программе при запуске - массив строк.
Код: Vala
  1. void main(string[] args1)
  2. {
  3.         foreach (string s in args1)
  4.         {
  5.                 stdout.printf(@"$s \n");
  6.         }
  7. }
А вот пример ее работы:./1 -tt -g
./1
-tt
-g
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Конструкторы в Vala
« Ответ #9 : 01 Июнь 2014, 22:54:56 »
Поговорим о конструкторах. Конструктор - процедура функция создающая новый экземпляр класса класса.
Код: Vala
  1. public class first
  2. {
  3.         public first()
  4.         {
  5.                 stdout.printf("Экземпляр класса создан\n");
  6.         }
  7. }
  8.  
  9. public void main()
  10. {
  11.         var f = new first();
  12. }
Конструктор с параметрами
Код: Vala
  1. public class first
  2. {
  3.         public first(int i)
  4.         {
  5.                 stdout.printf(@"$i \n");
  6.         }
  7. }
  8.  
  9. public void main()
  10. {
  11.         var f = new first(0);
  12. }
А теперь пример вызова конструктора суперкласса в субклассе
Код: Vala
  1. public class first
  2. {
  3.         public first(int i)
  4.         {
  5.                 stdout.printf("%d \n", i);
  6.         }
  7. }
  8.  
  9. public class second : first
  10. {
  11.         public second()
  12.         {
  13.                 base(0);
  14.         }
  15. }
  16. public void main()
  17. {
  18.         var f = new second();
  19. }
Если забыли что такое суперкласс и субкласс смотрите тут
« Последнее редактирование: 02 Июнь 2014, 10:17:53 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Сравнение и приравнивание классов и структур
« Ответ #10 : 13 Январь 2015, 18:50:15 »
В Vala существуют классы и структуры. Между ними существует разница. Классы сравниваются, приравниваются по ссылке.
Пример
Код: Vala
  1. void main()
  2. {
  3.         Test t1;
  4.         Test t2;
  5.         t1 = new Test()
  6.         t2 = t1
  7.         t1.val = 5;
  8.         stdout.printf("%d\n", t2.val);
  9. }
  10.  
  11. class Test
  12. {
  13.         public int val;
  14. }
Выполняем и получаем 5. Для примера нарисую схему.
Сначала, после выполнения 3 строки создаётся объект t1, t2 ведёт в никуда.t1 -> 0x...
t2 -> null
После выполнения 4 строчки t2 ссылается на то же самый объектt1 -> 0x...
       ^
       |
t2 ----+
Классы сравниваются по ссылке.
Код: Vala
  1. void main()
  2. {
  3.         var t1 = new Test();
  4.         var t2 = new Test();
  5.         if(t1 == t2)
  6.         {
  7.                 stdout.printf("==\n");
  8.         }
  9.         stdout.printf("%d %d\n", t1.val, t2.val);
  10. }
  11.  
  12. class Test
  13. {
  14.         public int val;
  15. }
Как вы уже догадались программа выведет 0 0 так как t1 и t2 указывают на разные участки памяти.
Теперь рассмотрим структуры.
Код: Vala
  1. void main()
  2. {
  3.         var t1 = Test();
  4.         var t2 = t1;
  5.         t1.val = 5;
  6.         stdout.printf("%d\n", t2.val);
  7. }
  8.  
  9. struct Test
  10. {
  11.         public int val;
  12. }
Вывод: 0.
Код: Vala
  1. void main()
  2. {
  3.         var t1 = Test();
  4.         var t2 = Test();
  5.         if(t1 == t2)
  6.         {
  7.                 stdout.printf("==\n");
  8.         }
  9.         stdout.printf("%d %d\n", t1.val, t2.val);
  10. }
  11.  
  12. struct Test
  13. {
  14.         public int val;
  15. }
Запускаем==
0 0
Структуры сравниваются по значению.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Примеры оконного приложения и анимации
« Ответ #11 : 24 Март 2015, 01:53:28 »
Теперь немного примеров. Оконное приложение.
Код: Vala
  1. using Gtk;
  2.  
  3. int main (string[] args) {
  4.         Gtk.init (ref args);
  5.         var window = new Window ();
  6.         /* Устанавливаем заголовок окна*/
  7.         window.title = "First GTK+ Program";
  8.         window.border_width = 10;
  9.         /*Окно будет показано в центер экрана*/
  10.         window.window_position = WindowPosition.CENTER;
  11.         /*Указываем размер окна*/
  12.         window.set_default_size (350, 70);
  13.         /*Указываем какая функция будет вызвана при закрытии окна
  14.         Подробнее о событиях позже*/
  15.         window.destroy.connect (Gtk.main_quit);
  16.         /*Создаём кнопку и говорим что произойдёт при нажатии*/
  17.         var button = new Button.with_label ("Click me!");
  18.         button.clicked.connect (() => {
  19.                 /*Надпись на кнопке изменится на "Thank you"*/
  20.                 button.label = "Thank you";
  21.         });
  22.         /*Добавляем кнопку к окну*/
  23.         window.add (button);
  24.         /*Показываем окно*/
  25.         window.show_all ();
  26.         Gtk.main ();
  27.         return 0;
  28. }
Собираемvalac --pkg gtk+-3.0 имя\ файла.valaА вот самый простой пример двухмерной векторной анимации
Код: Vala
  1. using Gtk;
  2. using Cairo;
  3.  
  4. public class Animation : Gtk.Window
  5. {
  6.         private int x;
  7.         private int s_x;
  8.         private const int speed = 3;
  9.        
  10.         public Animation()
  11.         {
  12.                 this.title = "Animation";
  13.                 this.destroy.connect(Gtk.main_quit);
  14.                 set_default_size(400, 400);
  15.                 var drawing_area = new DrawingArea();
  16.                 drawing_area.draw.connect(on_draw);
  17.                 add(drawing_area);
  18.                 s_x = speed;
  19.         }
  20.        
  21.         private bool on_draw(Widget da, Context ctx)
  22.         {
  23.                 /*Устанавливаем цвет. Обратите внимание - значение яркости канала от 0 до 1*/
  24.                 ctx.set_source_rgb(0x9A / 255.0, 0xCD / 255.0, 0x32 / 255.0);
  25.                 /*Рисуем квадрат*/
  26.                 draw_sq(ctx);
  27.                 return true;
  28.         }
  29.        
  30.         private void draw_sq(Context ctx)
  31.         {
  32.                 ctx.save();
  33.                 /*Простейший код движения, с отскоком от краёв*/
  34.                 if(x > 350)
  35.                 {
  36.                         s_x = -speed;
  37.                 }
  38.                 else if(x < 0)
  39.                 {
  40.                         s_x = speed;
  41.                 }
  42.                 x += s_x;
  43.                 /*Рисуем квадрат*/
  44.                 ctx.new_path();
  45.                 ctx.move_to(x, 200);
  46.                 ctx.rel_line_to(50, 0);
  47.                 ctx.rel_line_to(0, 50);
  48.                 ctx.rel_line_to(-50, 0);
  49.                 ctx.close_path();
  50.                 ctx.fill();
  51.                 ctx.restore();
  52.         }
  53.        
  54.         static int main (string[] args)
  55.         {
  56.                 Gtk.init(ref args);
  57.                 var cairo_sample = new Animation();
  58.                 cairo_sample.show_all();
  59.                 /*Прорисовка осуществляется 60 раз в секунду
  60.                 Если закоментировать следующую строчку, то прорисовка будет не регулярной,
  61.                 например при разворачивании окна*/
  62.                 Timeout.add(17,()=>{cairo_sample.queue_draw();return true;});
  63.                 Gtk.main();
  64.                 return 0;
  65.         }
  66. }
Если что не понятно - задавайте вопросы.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Коварные стороны математики
« Ответ #12 : 06 Июнь 2015, 11:36:19 »
Сейчас мы рассмотрим тему коварства математики в vala
(Нажмите, чтобы показать/скрыть)
Например у нас есть такой код
Код: Vala
  1. void main()
  2. {
  3.         var a = 0.1;
  4.         var b = 0.2;
  5.         if(a + b == 0.3)
  6.         {
  7.                 stdout.printf("Равно\n");
  8.         }
  9.         else
  10.         {
  11.                 stdout.printf("Не равно\n");
  12.         }
  13. }
Что будет после того как мы запустим этот код? Забудьте то чему вас учили в школе :). Выведется
Цитировать
Не равно
Не верите? Проверьте у себя. :). Почему так происходит? При переводе некотрых десятичных дробных чисел получается безконечная двоичная дробь, которая округляется. Но для компьютера числа типа 0.99...99 и 1.00...01 это разные числа. Подтверждение
Код: Vala
  1. void main()
  2. {
  3.         var a = 0.1;
  4.         var b = 0.2;
  5.         stdout.printf(@"$a + $b = $(a + b)");
  6. }
Вывод0.10000000000000001 + 0.20000000000000001 = 0.30000000000000004Как нам сравнивать числа?
Код: Vala
  1. void main()
  2. {
  3.         var a = 0.1;
  4.         var b = 0.2;
  5.         if(-1E-2 < a + b - 0.3 < 1E-2)
  6.         {
  7.                 stdout.printf("Равно\n");
  8.         }
  9.         else
  10.         {
  11.                 stdout.printf("Не равно\n");
  12.         }
  13. }
Vala поддерживает форму записи a < b < c в отличии от многих других языков программирования. Пока это эксперементальная фича. Собирать такvalac имя\ файла.vala --enable-experimentalЗаписывать так результат - с_чем_сравнить1E-2Означает 0.01.
Код: Vala
  1. void main()
  2. {
  3.         var r = 1/2;
  4.         stdout.printf(@"$r\n");
  5. }
Что выведет?0Почему? Если забыли повторите урок №2. Ещё один аспект
Код: Vala
  1. void main()
  2. {
  3.         int a = int.MAX;
  4.         stdout.printf(@"$a\n");
  5.         a++;
  6.         stdout.printf(@"$a\n");
  7. }
Что выведет? У меня вывел 2147483647
-2147483648
Почему? Произошло переполнение. Один из извесных примеров этой ошибки - поведение Ганди в Civilization.
(Нажмите, чтобы показать/скрыть)
На этом пока всё.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Синтаксический сахар: строки
« Ответ #13 : 15 Июль 2015, 17:22:52 »
Сейчас мы рассмотрим немного синтаксического сахара, связанного со строками. В Vala типизация строгая, а значит такой пример не пройдёт.
Код: Vala
  1. var n = 5;
  2. var s = "число " + n;
Нужно писать так
Код: Vala
  1. var n = 5;
  2. var s = "число " + n.to_string();
В Vala это можно сделать гораздо короче:
Код: Vala
  1. var n = 5;
  2. var s = @"число $n";
Подстановка значения поля переменной:
Код: Vala
  1. class Apple {
  2.     public int size;
  3.     public Apple() {
  4.         size = 7;
  5.     }
  6. }
  7.  
  8. void main() {
  9.     var a = new Apple();
  10.     var s = @"Размер яблока равен $(a.size)см";
  11. }
Использования значения функции:
Код: Vala
  1. int b(ref int c)
  2. {
  3.     c++;
  4.     return c + 8;
  5. }
  6.  
  7. void main() {
  8.     int c = 9;
  9.     stdout.printf(@"$(b(ref c)) $c\n");
  10. }
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Автор темы
  • Старожил
  • *
  • Сообщений: 4093
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Регулярные выражения
« Ответ #14 : 12 Сентябрь 2015, 01:35:17 »
Несколько слов о регекспах. Объявить переменную можно так
Код: Vala
  1. var var_name = /regex/;
Что мы видим? Регулярные выражения из коробки. Можно скопипастить выражение из баша не задумываясь об экранировании. Например следующий код будет Проверять содержит ли строка точку.
Код: Vala
  1. void main() {
  2.         if(/\./i.match("test.")) {
  3.                 stdout.printf("true\n");
  4.         }
  5. }
Если бы мы писали к примеру на си, то регексп нужно было бы записать так "\\.". Елси у вас есть программа на другом языке то менять запись не обязательно. А ещё этот пример покажет как заменять части строк.
Код: Vala
  1. void main() {
  2.         try {
  3.                 var quote = "10. 11. 12.";
  4.                 var regex = new Regex("\\."); //Не забываем экранировть слеш
  5.                 var result = regex.replace(quote, quote.length, 0, ",");
  6.                 stdout.printf(result);
  7.         } catch (RegexError e) {
  8.                 stdout.printf ("Error: %s\n", e.message);
  9.         }
  10. }
« Последнее редактирование: 11 Декабрь 2016, 01:15:26 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

 

Страница сгенерирована за 0.419 секунд. Запросов: 23.