Что делает ** node.borrow ()? - PullRequest
       6

Что делает ** node.borrow ()?

0 голосов
/ 19 февраля 2020
/// Traverses the network of nodes and returns the input node
fn get_input(node: Rc<RefCell<Box<Node>>>) -> Rc<RefCell<Box<Node>>> {
    match **node.borrow() { // here
        Node::Input { .. } => Rc::clone(&node),
        _ => { ... },
    }
}

Я не понимаю, почему было предложено это редактирование и почему оно работает. Что мне кажется наиболее запутанным, так это неявные разыменования, которые иногда случаются.

Например, .borrow() - это метод RefCell, но мне разрешено вызывать его напрямую на Rc. Более того, это тоже работает: **(*node).borrow().

1 Ответ

1 голос
/ 20 февраля 2020

let node = *(*((*node).borrow())) эквивалентно:

let node = *node; // Rc implements Deref, node is now RefCell<Box<Node>>
let node =  node.borrow(); // a RefCell method, node is now Ref<<'empty>, Box<Node>>
let node = *node; // Ref implements Deref, node is now Box<Node>
let node = *node; // Box implements Deref, node is now Node

Явная форма *(*((*node).borrow())) эквивалентна неявной **node.borrow(), поскольку (из-за приоритета оператора и) приведения с разыменованием, в результате чего Rc автоматически разыменовывается для вызова .borrow() для применения к тому, на что он указывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...