«Разрушительный» означает, что аргументы функции (или получателя в методе oop) могут быть изменены.Неразрушающая функция означает, что она не изменяет свои аргументы, а вместо этого возвращает измененную copy .Преимущество использования деструктивной функции заключается в том, что вам не нужно создавать эту копию, и, таким образом, вам обычно требуется меньше mallocs (в этом примере, однако, число одинаковое).
В реализации icons
, которую вы предоставили, вы можете видеть, что постоянная запись сохраняет исходный ilist il
действительный неизмененный список !: Любой, кто использует ilist il
, не заметит, что вы что-то сделали (этоконечно, работает только с односвязными списками).
Сначала деструктивная реализация позволяет вам изменять аргументы, но также подразумевает , что вы должны изменитьаргументы в значимой форме: вы должны изменить его так, чтобы кто-то, у кого еще есть ссылка на оригинал ilist il
, должен увидеть вашу модификацию.Вы можете сделать это следующим образом:
// observation: the names are not the best, i would call it destructiveICons
// (and ->first should be called ->value)
ilist icons_destroy(int in, ilist il) {
ilist second = malloc(sizeof(struct ilist_ADT));
second->length = il->length
second->first = il->first
second->rest = il->rest;
il->length += 1;
il->rest = second;
il->first = in;
return il;
}
Теперь кто-то другой, имеющий ссылку на ilist il
, увидит элемент new-first, за которым следует элемент old-ранее-first.