amarao_san

Category:

растовое

Я решил, что написать дерево на расте — это хорошая тренировка. Она оказалась лучше, чем я ожидал.

Во-первых мне взорвал мозг borrow checker, который я считал простым и понятным. Во-вторых мне пришлось вывернуть мозг (и я написал-таки add своей мечты). Единственным решением было использовать mem::replace. Я не нашёл метода как можно иметь match по типу enum (без copy, но с реальными значениями) и ещё при этом менять себя.

(тредик: https://users.rust-lang.org/t/different-borrowing-in-match-variants/53532/10)

Насколько я понял, это пока несовершенство borrow checker.

В третьих, когда я писал search, на меня снизошло просветление и я почти сразу же понял, что писать так:

fn search(&self, p: Point) -> Option<T>

для произвольного T нельзя. Что значит «вернуть T?» Откуда его взять? Изнутри дерева? Тогда либо & mut self (потому что мы его вынимаем), либо self (потому что забираем себя целиком).

А на самом деле надо было писать так:

fn search<'a>(&'a self, p: Point) -> Option<&'a T>

Мы возвращаем ссылку на найденные данные, и эта ссылка живёт столько, сколько само дерево. (Возможно, меня ждёт боль и невозможность при попытке написать удаление — но я не планирую удаление).

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

Error

default userpic

Your IP address will be recorded 

When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.