Stati c вызов нестатических c методов - PullRequest
2 голосов
/ 07 августа 2020

По разным причинам мне нравится вызывать обычные методы, как если бы они были c, например, без использования точечной записи. (Например, Vec::len( &v ) вместо v.len().) Я всегда могу сделать это своими собственными методами; однако с некоторыми методами, принадлежащими стандартной библиотеке, я по какой-то причине не могу этого сделать. Например, Vec::binary_search( &v, &t ) не компилируется («для struct std::vec::Vec<_> в текущей области не найдено ни одной функции или связанного элемента с именем binary_search»), даже если v.binary_search( &t ) делает. Почему?

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Это потому, что binary_search - это метод срезов , а не Vec.

Он доступен на Vec, потому что Vec derefs для нарезки , а метод вызывает auto-deref (именно поэтому вы можете вызывать методы T на Box<T> или &T, несмотря на то, что эти методы не реализовано по Box или ссылкам).

1 голос
/ 07 августа 2020

binary_search не реализовано в Vec. Вызов v.binary_search(...) работает, потому что Deref<Target=[T]> и binary_search реализованы на [T].

Вот как заставить его работать как связанную функцию.

<[_]>::binary_search(&v, &t);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...