Rust中与Swift扩展方法具有相同泛型参数约束的等效方法是什么?

3
在Swift中,我可以为具有参数相等约束的泛型类型添加方法。
extension Optional where Wrapped == String {
    // Available only for `Optional<String>` type.
    func sample1() { ... }
}

如何在Rust中实现这个功能?


更新

这个功能被称为带有通用where从句的扩展

我认为这基本上是与Rust的impl具有相同的特性,只不过没有明确的trait。

trait OptionUtil {
    fn sample1(&self);
}

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

等同于(不需要显式 trait)

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

因此,我认为这段 Rust 代码应该可以工作,但是它出现了一个错误。(等式约束在 where 子句中还不被支持(参见 #20041)
impl<T> OptionUtil for Option<T> where T == String {
    fn sample1(&self) {
        println!("{:#?}", self);
    }
}

请查看以下编程相关内容:https://doc.rust-lang.org/std/cmp/trait.PartialEq.html 和 https://doc.rust-lang.org/book/ch10-02-traits.html - Stargateur
@Stargateur,我认为PartialEq/Eq特质相当于Swift中的Equatable协议。但这不是我在这里询问的内容。 - eonil
哦,你想要 https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md 吗? - Stargateur
1
他想要实现impl Foo for Option<String>,用于某个扩展特性Foo。@Eonil,由于我们并不都熟悉Swift,你能描述一下这个功能是做什么的吗? - mcarton
@mcarton,我认为你所说的正是我在寻找的。它的效果和我预期的一样。谢谢。你能否将你的评论转换成一个答案?顺便说一下,我已经更新了我的问题。 - eonil
@Stargateur 我认为这是另外一件事情,尽管它看起来与此高度相关。 - eonil
1个回答

3
你可以只为具体类型 Option<String> 实现这个 trait:
impl OptionUtil for Option<String> {
    fn sample1(self: &Self) {
        println!("{:#?}", self);
    }
}

我写了一个叫做 type_eq 的 crate,可以让你编写更像 Swift 示例的代码。但它与为 Option<String> 实现 trait 是相同的:

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);
}

实际上,这个创建物件很少有用的情况。大多数情况下,上面更简单的代码将会生效并且被优先选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接