Типы и значения
Основные типы — data (запись), enum (сумма с вариантами, у которых могут быть поля) и объединения A | B. Методы пишутся в
impl, static fn вызывается как Point.origin(). Внутри метода поля доступны по имени.
data Point { x: f64; y: f64 }
impl Point {
static fn origin() -> Point => Point{ x: 0.0, y: 0.0 }
fn dist2() -> f64 => x * x + y * y
}
enum Shape {
Circle(r: f64)
Rect(w: f64, h: f64)
Empty
}
// match должен быть исчерпывающим
fn area(s: Shape) -> f64 pure =>
match s {
Circle(r) => 3.0 * r * r
Rect(w, h) => w * h
Empty => 0.0
}
fn main() io {
let p = Point{ x: 3.0, y: 4.0 }
print("{p.dist2()}")
var names: List<str> = ["ann", "bob"] // var — изменяемая переменная, let — нет
names.push("eve")
print("{names.len()} {names}")
let ages: Map<str, i32> = {"ann": 31, "bob": 25}
print("{ages.get("bob") ?? 0} {ages.get("zed") ?? -1}") // get возвращает i32?
print("{area(Shape.Rect(2.0, 5.0))} {area(Shape.Empty)}")
let squares = from n in 1..=5 select n * n // запрос в памяти: ленивый итератор
print("{squares.toList()}")
}Вывод
25.0 3 ["ann", "bob", "eve"] 25 -1 10.0 0.0 [1, 4, 9, 16, 25]
Что дальше изучить#
- Владение и заимствование без явных времён жизни — §7: значение перемещается при передаче,
cloneкопирует,&Tзаимствует. - Уточнённые типы (
type Percent = u8 where 0..=90),distinct-типы,@derive(Copy, Eq, Ord, Hash, Show)— §3 и §4. - Интерфейсы структурные: подходит любой тип с нужными методами (§4.6); встраивание
embedи перегрузка операторов — V.3. - Стандартные коллекции и итераторы —
std.core.