【问题标题】:Type Matching with a Tuple + Option/Some使用元组 + 选项/某些进行类型匹配
【发布时间】:2022-06-15 04:33:10
【问题描述】:

我已经在 Rust 项目上工作了很长一段时间来学习 rust,并且遇到了一个我已经工作了很长时间但不确定是否可以在 rust 中完成的阻止程序。

主要目标
我希望能够将一个元组 (x, y) 与另一个元组进行比较,但如果其中一个值(在同一位置)匹配,则表达式评估为 true。例如。

(x, y) == (a, y) = True
(x, z) == (z, x) = False
(x, z) == (x, b) = True

我尝试了什么
我知道执行 match 语句是最直接的方法,但我将此元组传递给使用此元组查询地图的第三方函数。

所以我尝试使用 Option,并用 Some 包装值并尝试做类似的事情

(Some(_), Some(a)) == (Some(g), Some(a)) = Want this to equal true.

但它没有奏效。

我在 rust 中尝试做的事情可能吗?我能做些什么来尝试做到这一点?非常感谢您的宝贵时间。

编辑:
为了更清楚地说明这一点,这是使用此元组的函数。

let entries_data = ENTRIES.may_load(deps.storage, (<<<anything>>>, address));

这个元组被用来查询一个地图,我希望能够使用一个允许它的内容之一是任何内容的元组进行查询(所以它只匹配元组中的一个项目)。

【问题讨论】:

  • 根据您的编辑,解决方案在很大程度上取决于ENTRIES 是什么以及may_load 是否支持这种查询。此外,您需要一个 value 来进行比较,而 pattern(您正在尝试使用 Some(_))不是一个值。

标签: rust tuples


【解决方案1】:

Rust match 只能匹配静态模式。不能匹配变量。

正确的方法是简单的if

if a.0 == b.0 || a.1 == b.1 { ... }

【讨论】:

    【解决方案2】:

    您可以创建一个新类型并为其实现PartialEq

    可能是这样的:

    struct MyTuple<T: PartialEq>(pub T, pub T);
    
    impl<T: PartialEq> PartialEq for MyTuple<T> {
        fn eq(&self, other: &Self) -> bool {
            self.0 == other.0 || self.1 == other.1
        }
    }
    
    impl<T: PartialEq> Eq for MyTuple<T> {}
    
    fn main() {
        let a = MyTuple(1, 2);
        let b = MyTuple(1, 3);
        let c = MyTuple(4, 2);
        let d = MyTuple(3, 1);
        let e = MyTuple(1, 5);
        
        println!("(1, 2) == (4, 2) : {}", a == c);
        println!("(1, 3) == (3, 1) : {}", b == d);
        println!("(1, 3) == (1, 5) : {}", b == e);
        // (1, 2) == (4, 2) : true
        // (1, 3) == (3, 1) : false
        // (1, 3) == (1, 5) : true
    }
    

    example in rust playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多