Почему io:: copy требует, чтобы reader и writer были изменяемыми ссылками?

#rust #immutability #traits

#Ржавчина #неизменяемость #Трейты

Вопрос:

Почему std::io::copy требуется, чтобы аргументы reader и writer передавались как изменяемые ссылки?

Я могу понять, почему writer необходимо изменить, чтобы в него были записаны данные, изменяя его внутреннее состояние.

Однако, почему reader также должен быть помечен как изменяемая ссылка? Если я только считываю данные, то не нужна ли мне просто ссылка на данный тип, а не изменяемая ссылка?

Ответ №1:

Потому что Read типы, в общем, одноразовые: читая из него, вы изменяете его.

Рассмотрим стандартный ввод: вы можете прочитать из него только один раз, поэтому, должно быть, что-то меняется. Когда вы читаете из сокета, вы почти наверняка изменяете внутренний буфер, используемый для учета различий между получаемыми сетевыми пакетами и количеством данных, которые вы хотите прочитать в любой данный момент. Как насчет чтения из Chain , которое используется для объединения читаемых объектов вместе; без мутации он не может отслеживать, с какого из них он должен считывать.

Конечно, возможно иметь Read тип, которому не нужен изменяемый доступ для выполнения чтения, но это не универсально верно, и поскольку это не универсально верно, Read признак требует изменяемого доступа.

Комментарии:

1. На самом деле это совершенно четкое объяснение. Спасибо!