#rust #immutability #traits
#Ржавчина #неизменяемость #Трейты
Вопрос:
Почему std::io::copy
требуется, чтобы аргументы reader и writer передавались как изменяемые ссылки?
Я могу понять, почему writer необходимо изменить, чтобы в него были записаны данные, изменяя его внутреннее состояние.
Однако, почему reader также должен быть помечен как изменяемая ссылка? Если я только считываю данные, то не нужна ли мне просто ссылка на данный тип, а не изменяемая ссылка?
Ответ №1:
Потому что Read
типы, в общем, одноразовые: читая из него, вы изменяете его.
Рассмотрим стандартный ввод: вы можете прочитать из него только один раз, поэтому, должно быть, что-то меняется. Когда вы читаете из сокета, вы почти наверняка изменяете внутренний буфер, используемый для учета различий между получаемыми сетевыми пакетами и количеством данных, которые вы хотите прочитать в любой данный момент. Как насчет чтения из Chain
, которое используется для объединения читаемых объектов вместе; без мутации он не может отслеживать, с какого из них он должен считывать.
Конечно, возможно иметь Read
тип, которому не нужен изменяемый доступ для выполнения чтения, но это не универсально верно, и поскольку это не универсально верно, Read
признак требует изменяемого доступа.
Комментарии:
1. На самом деле это совершенно четкое объяснение. Спасибо!