Все функции должны знать размер своих аргументов во время компиляции. Однако вы используете w
, размер которого невозможно определить во время компиляции. Вместо этого, чтобы иметь возможность выполнять динамическую диспетчеризацию c, вам нужно использовать объект черты. Вы можете сделать это sh двумя способами.
Вы можете передать указатель, используя Box
:
fn edit(w: Box<Word>)
или ссылку:
fn edit(w: &Word)
Другой вариант, который у вас есть, - вообще избегать использования черт объектов. Вместо этого вы можете сделать edit
обобщенный c метод следующим образом:
fn edit(w: impl AsRef<str>)
или
fn edit<W: AsRef<str>>(w: W)
При таком подходе компилятор выполняет так называемую «мономорфизацию», где во время компиляции он точно определяет, какие типы передаются для ваших обобщенных c аргументов, и генерирует несколько не обобщенных c версий для каждого из этих вызовов с указанными c типами. Мономорфизация достаточно хорошо объяснена в Что такое мономорфизация с контекстом для C ++? .