OxL Справочник OxL
РусскийEnglish

data Sender

Channel endpoints (§8.7).

Example:

oxl✓ проверяется в CI
fn main() io {
  let (tx, rx) = chan<i64>(cap: 2)
  tx.send(1)!
  tx.send(2)!
  print("{rx.recv()!} {rx.recv()!}")
}
Вывод
1 2

Примеры#

Рецепты каналов: буфер, tryRecv, клонирование отправителя, закрытие.

Буфер и закрытие#

chan<T>(cap: n) создаёт буферизованный канал; tryRecv не ждёт. Канал закрывается, когда уничтожены все Sender; после этого recv возвращает Closed.

oxl✓ проверяется в CI
fn main() io, time {
  let (tx, rx) = chan<i32>(cap: 2)  // буфер на 2 значения
  _ = tx.send(1)
  _ = tx.send(2)  // третий send ждал бы, пока читатель освободит место
  print("{rx.tryRecv() ?? -1} {rx.tryRecv() ?? -1} {rx.tryRecv() ?? -1}")  // tryRecv не ждёт: none, если пусто
  let tx2 = tx.clone()  // Sender можно клонировать
  _ = tx2.send(10)
  print("{rx.recv().ok() ?? -1}")
  drop(tx)
  drop(tx2)  // закрыты все отправители
  match rx.recv() {
    i32 v => print("got {v}")
    Closed => print("closed")  // после закрытия recv возвращает Closed
  }
}
Вывод
1 2 -1
10
closed
@builtin("Sender") pub(api) data Sender<T>

Потокобезопасность. `clone()` it to give every producer task its own sender.

С версии. 1.0.0-beta

Методы

send(x: T) -> () | Closed
Sends a value, waiting while the buffer is full; Closed if the receiver is gone.
clone() -> Sender<T>
Another sender of the same channel; the channel closes when all senders are gone.

Определено в: std/core/types.oxl:476

См. также

OxL 1.0.0-beta · Версия документации 1.0.0-beta© OxwaldLink · сгенерировано из Стандарта, исходников std и руководства