Rust эквивалентен методам расширения Swift с равным ограничением общего параметра? - PullRequest
2 голосов
/ 09 ноября 2019

В Swift я могу добавить метод к универсальному типу с ограничением равенства параметров.

extension Optional where Wrapped == String {
    // Available only for `Optional<String>` type.
    func sample1() { ... }
}

Как это сделать в Rust?


Обновление

Эта функция называется Расширения с общим предложением Where .

Я думаю, что это в основном та же функция, что и у Rust impl с where предложением без явной черты.

trait OptionUtil {
    fn sample1(&self);
}

impl<T> OptionUtil for Option<T> where T:std::fmt::Debug {
    fn sample1(&self) {
        println!("{:#?}", self);
    }
}

Эквивалентно (без явной черты)

extension Optional where Wrapped: DebugDescription {
    func sample1() {
        print("\(self)")
    }
}

Поэтому я думал, что этот код Rust будет работать, но он не 'не работает с ошибкой. (equality constraints are not yet supported in where clauses (see #20041))

impl<T> OptionUtil for Option<T> where T == String {
    fn sample1(&self) {
        println!("{:#?}", self);
    }
}

1 Ответ

2 голосов
/ 10 ноября 2019

Вы можете просто реализовать черту для конкретного типа Option<String>:

impl OptionUtil for Option<String> {
    fn sample1(self: &Self) {
        println!("{:#?}", self);
    }
}

Я написал ящик, type_eq , который позволит вам написать что-то, что выглядит больше похоже на ваш пример Swift. Но это идентично реализации черты для Option<String>:

use type_eq::{Constrain, TypeEq};
use std::fmt::Debug;

trait OptionUtil {
    fn sample1(&self);
}

impl<T> OptionUtil for Option<T>
where
    Constrain: TypeEq<T, String>,
    T: Debug,
{
    fn sample1(&self) {
        println!("{:#?}", self);
    }
}

fn main() {
    let s = Some(String::from("hello"));
    println!("{:?}", s);
}

На самом деле очень мало случаев, когда этот ящик полезен. Большую часть времени будет работать более простой код, приведенный выше, и это предпочтительнее.

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