Search
Write a publication
Pull to refresh
1
0
Send message

Можно ещё так:


declare const CarSymbol: unique symbol;
type CarId = string & typeof CarSymbol;

declare const BoatSymbol: unique symbol;
type BoatId = string & typeof BoatSymbol;

function processCar(id: CarId) {}
function processBoat(id: BoatId) {}
function processString(value: string) {}

let carId = <CarId>'car uuid';
let boatId = <BoatId>'boat uuid';

processCar(carId);
processCar(boatId); // error

processBoat(carId); // error
processBoat(boatId);

processString(carId); // ok
processString(boatId); // ok

Вообще горячий топик
https://github.com/Microsoft/TypeScript/issues/202

zharko_mi интересные первые впечатления, спасибо за статью.


Box — неизменяемое значение на куче

это ссылка, значение по ссылке менять можно


В первом примере если заменить


Box<Option<MyStruct>>

на


Opttion<Box<MyStruct>>

то можно будет писать None вместо Box::new(None)


А ещё можно делать так:


let value = 1;
let next = None;
let node = Node { value, next }; // привет любителям JS!

Удобно для конструкторов:


struct Point {
  x: i32,
  y: i32,
}
impl Point {
  fn new(x: i32, y: i32) -> Self {
    Point { x, y }
  }
}

Пример со списком можно немного аккуратнее сделать (ссылка на плэйграунд):


fn add(&mut self, value: i32) {
  let next = Link::new(value);
  if let Some(ref last) = self.last {
    last.borrow_mut().next = next.clone();
  } else {
    self.root = next.clone();
  }
  self.last = next;
}

Вообще люди из ML языков находят в расте много знакомого, кто раньше писал на скале — тоже.
Мне после JavaScript замыканий почему-то многие базовые концепты из раста очень легко дались.

Information

Rating
Does not participate
Registered
Activity