|
1 | 1 | # Channels
|
2 | 2 |
|
3 |
| -Канала (channels) это пара модулей (`In_channel` и `Out_channel`) из стандартной библиотеке, абстрагирующие работу с файловыми потоками. |
| 3 | +Канала (channels) это пара модулей (`In_channel` и `Out_channel`) из стандартной библиотеке, |
| 4 | +упрощающие работу с файловыми потоками. Это не абстракция, а именно обвёртка над файловым интерфейсом |
| 5 | +операционной системы. |
4 | 6 |
|
5 | 7 | > [!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