mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-25 08:13:29 +03:00
185 lines
4.8 KiB
Markdown
Executable File
185 lines
4.8 KiB
Markdown
Executable File
---
|
|
language: vala
|
|
contributors:
|
|
- ["Milo Gilad", "https://github.com/Myl0g"]
|
|
filename: LearnVala.vala
|
|
---
|
|
|
|
In GNOME's own words, "Vala is a programming language that aims to bring modern programming language features to GNOME developers without imposing any additional runtime requirements and without using a different ABI compared to applications and libraries written in C."
|
|
|
|
Vala has aspects of Java and C#, so it'll be natural to those who know either or.
|
|
|
|
[Read more here.](https://wiki.gnome.org/Projects/Vala)
|
|
|
|
```vala
|
|
|
|
// Single line comment
|
|
|
|
/* Multiline
|
|
Comment */
|
|
|
|
/**
|
|
* Documentation comment
|
|
*/
|
|
|
|
/* Data Types */
|
|
|
|
// Vala supports the data types supported by most other programming languages.
|
|
|
|
char character = 'a'
|
|
unichar unicode_character = 'u' // 32-bit unicode character
|
|
|
|
int i = 2; // ints can also have guaranteed sizes (e.g. int64, uint64)
|
|
uint j = -6; // Won't compile; unsigned ints can only be positive
|
|
|
|
long k;
|
|
|
|
short l;
|
|
ushort m;
|
|
|
|
string text = "Hello,"; // Note that the == operator will check string content
|
|
|
|
string verbatim = """This is a verbatim (a.k.a. raw) string. Special characters
|
|
(e.g. \n) are not interpreted. They may also be multiple lines long.""";
|
|
|
|
// String Templates allow for easy string formatting
|
|
string string_template = @"$text world"; // "$text" evaluates to "Hello"
|
|
|
|
int test = 5;
|
|
int test2 = 10;
|
|
string template2 = @"$(test * test2) is a number."; // Expression evaluation
|
|
|
|
string template_slice = string_template[7:12]; // => "world"
|
|
|
|
// Most data types have methods for parsing.
|
|
|
|
bool parse_bool = bool.parse("false"); // => false
|
|
int parse_int = int.parse("-52");
|
|
string parse_string = parse_int.to_string();
|
|
|
|
/* Basic I/O */
|
|
|
|
stdout.printf(parse_string); // Prints to console
|
|
string input = stdin.read_line(); // Gets input from console
|
|
|
|
stderr.printf("Error message"); // Error printing
|
|
|
|
/* Arrays */
|
|
|
|
int[] int_array = new int[10]; // Array of ints with 10 slots
|
|
int better_int_array[10]; // Shorter way of making int array with 10 slots
|
|
int_array.length; // => 10;
|
|
|
|
int[] int_array2 = {5, 10, 15, 20}; // Can be created on-the-fly
|
|
|
|
int[] array_slice = int_array2[1:3]; // Slice (copy of data)
|
|
unowned int[] array_slice_ref = int_array2[1:3]; // Reference to data
|
|
|
|
// Multi-dimensional Arrays (defined with a number of commas in the brackets)
|
|
|
|
int[,] multi_array = new int[6,4]; // 6 is the number of arrays, 4 is their size
|
|
int[,] multi_array2 = {{7, 4, 6, 4},
|
|
{3, 2, 4, 6},
|
|
{5, 9, 5, 1}};
|
|
multi_array2[2,3] = 12; // 2 is the array, 3 is the index in the array
|
|
int first_d = multi_array2.length[0] // => 3
|
|
int second_d = multi_array2.length[1] // => 4
|
|
|
|
// Stacked arrays (e.g. int[][]) where array lengths vary are not supported.
|
|
|
|
// Multi-dimensional arrays cannot be sliced, nor can they be converted to one-
|
|
// dimensional.
|
|
|
|
int[] add_to_array = {};
|
|
add_to_array += 12; // Arrays can be dynamically added to
|
|
|
|
add_to_array.resize(20); // Array now has 20 slots
|
|
|
|
uint8[] chars = "test message".data;
|
|
chars.move(5, 0, 7);
|
|
print ((string) chars); // Casts the array to a string and prints "message"
|
|
|
|
/* Control Flow */
|
|
|
|
var a = 1;
|
|
var b = 2;
|
|
int[] foreach_demo = {2, 4, 6, 8};
|
|
|
|
while (b > a) { // While loop; checks if expression is true before executing
|
|
b--;
|
|
}
|
|
|
|
do {
|
|
b--;
|
|
}
|
|
while (b > a); // Do While loop; executes the code in "do" before while (b > a)
|
|
|
|
for (a = 0; a < 10; a++) { stdout.printf("%d\n", a); } // for loop
|
|
|
|
foreach (int foreach_demo_var in foreach_demo) {
|
|
stdout.printf("%d\n", foreach_demo_var);
|
|
} // foreach works on any iterable collection
|
|
|
|
if (a == 0) {
|
|
break;
|
|
} else if (a > 1) {
|
|
stdout.printf("%d\n", a);
|
|
} else {
|
|
break;
|
|
} // if-then-else
|
|
|
|
switch (a) {
|
|
case 1:
|
|
stdout.printf("A is 1\n");
|
|
break;
|
|
case 5:
|
|
case 10:
|
|
stdout.printf("A is 5 or 10\n");
|
|
break;
|
|
default:
|
|
stdout.printf("???\n")
|
|
break;
|
|
} // switch statement
|
|
|
|
/* Reference Types */
|
|
|
|
// Reference types are classes.
|
|
|
|
class Message : GLib.Object { // Class Message extends GLib's Object
|
|
public string sender; // a public field
|
|
public string text {get; set;} // a public property
|
|
private bool sent = false; // private field
|
|
public void send() { // public method
|
|
sent = true;
|
|
}
|
|
|
|
}
|
|
|
|
int cast_to_float = 10;
|
|
float casted_float = (float) cast_to_float; // static casting; no runtime checks
|
|
|
|
// For runtime checks, use dynamic casting.
|
|
// Dynamically casted objects must meet the following:
|
|
// - Object's class is the same class as the desired type
|
|
// - Object's class is a subclass of the desired type
|
|
// - Desired class is an interface implemented by the object's class
|
|
|
|
float dyna_casted_float = cast_to_float as float // Won't compile
|
|
|
|
var inferred_string = "hello"; // Type inference
|
|
|
|
struct Closet {
|
|
public uint shirts;
|
|
public uint jackets;
|
|
}
|
|
|
|
enum HouseSize {
|
|
SMALL,
|
|
MODERATE,
|
|
BIG
|
|
}
|
|
|
|
```
|
|
|
|
* Read about building GUIs with GTK+ and Vala [here](http://archive.is/7C7bw).
|