Skip to content

Commit 58a96d8

Browse files
committed
Обновлён рецепт про каналы
1 parent 07b1257 commit 58a96d8

File tree

1 file changed

+39
-10
lines changed

1 file changed

+39
-10
lines changed

docs/recipes/channels.md

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,43 @@
11
# Channels
22

3-
Канала (channels) это пара модулей (`In_channel` и `Out_channel`) из стандартной библиотеке, абстрагирующие работу с файловыми потоками.
3+
Канала (channels) это пара модулей (`In_channel` и `Out_channel`) из стандартной библиотеке,
4+
упрощающие работу с файловыми потоками. Это не абстракция, а именно обвёртка над файловым интерфейсом
5+
операционной системы.
46

57
> [!NOTE] Именование
6-
> Сокращать название каналов можно до `oc` (`Out_channel`) и `ic` (`In_channel`). Либо используйте осознанные имена, вроде `config_file`.
7-
8-
> [!NOTE] Безопасная работа
9-
> Предпочитайте открытие _канала_ при помощи функций `with_open_*`, так как в случае исключений они безопасно закроют файл.
10-
>
11-
> ```ocaml
12-
> let () =
13-
> In_channel.with_open_text "some.file" @@ fun ic -> (* ... *)
14-
> ```
8+
> Сокращать название каналов можно до `oc` (`Out_channel`) и `ic` (`In_channel`).
9+
> Либо используйте осознанные имена, вроде `config_file`.
10+
11+
> [!NOTE] Смотрите также
12+
> Асинхронный ввод вывод: [Eio](../libraries/concurrency/eio.md), [Lwt](../libraries/concurrency/lwt.md).
13+
14+
## Безопасная работа
15+
16+
Предпочитайте открытие _канала_ при помощи функций `with_open_*`, так как
17+
в случае исключений они безопасно закроют файл.
18+
19+
```ocaml
20+
let () =
21+
In_channel.with_open_text "some.file" @@ fun ic -> (* ... *)
22+
```
23+
24+
## Канал из строчки
25+
26+
Из-за особенности [устройства channels](https://sourcegraph.com/github.com/ocaml/ocaml/-/blob/runtime/caml/io.h?L50:8-50:15), замокать это нельзя, но можно несколько извратиться посредством [пайпов](https://man7.org/linux/man-pages/man2/pipe.2.html). Пример кода взят от [сюда](https://discuss.ocaml.org/t/how-can-i-create-an-in-channel-from-a-string/8761/17):
27+
28+
```ocaml
29+
let in_channel_of_string str =
30+
let (in_file_fd, out_file_fd) = Unix.pipe () in
31+
32+
let ic = Unix.in_channel_of_descr in_file_fd in
33+
let out = Unix.out_channel_of_descr out_file_fd in
34+
35+
output_string out_channel str;
36+
close_out out;
37+
38+
ic
39+
```
40+
41+
Есть также готовая библиотека для этого под названием [redirect].
42+
43+
[redirect]: https://github.com/thierry-martinez/redirect

0 commit comments

Comments
 (0)