小编Eme*_*kin的帖子

合并两种错误类型的最惯用的方法是什么?

我有一个类型,Foo它的方法可能会“引发”相关类型的错误Foo::Err

pub trait Foo {
    type Err;
    
    fn foo(&mut self) -> Result<(), Self::Err>;
}
Run Code Online (Sandbox Code Playgroud)

我有另一个特性,它Bar有一个方法来处理Foo. Bar可能会发出自己的错误(由关联类型指定Bar::Err),但也可能会遇到由Foo它正在处理的生成的错误。

我可以看到两种方法来做到这一点,但我不知道哪一种最适合 Rust。

第一个将结果嵌入到结果中:

pub trait Bar1 {
    type Err;
    
    fn bar<F: Foo>(&mut self, foo: F) -> Result<Result<F, F::Err>, Self::Err>;
}
Run Code Online (Sandbox Code Playgroud)

第二个将两种错误类型合并到一个专用的枚举中:

pub trait Bar2 {
    type Err;
    
    fn bar<F: Foo>(&mut self, foo: F) -> Result<F, Choice<F::Err, Self::Err>>;
}
Run Code Online (Sandbox Code Playgroud)

第二个在语义上看起来更清晰,但为处理额外的枚举创建了一些障碍。

操场

error-handling idioms rust

5
推荐指数
2
解决办法
2441
查看次数

迭代类型而不实例化它

问题

我希望能够迭代类型而不实例化它,类似于枚举。

class Foo:
    """Class I want to iterate over without instantiating."""
    ALLOWED_VALUES = (1, 2, 3)

# I want iterating over `Foo` to be equivalent to iterating over `Foo.ALLOWED_VALUES`
for val_from_tuple, val_from_foo in zip(Foo.ALLOWED_VALUES, Foo):
    assert val_from_tuple == val_from_foo
Run Code Online (Sandbox Code Playgroud)

这种行为对于枚举来说是可能的,但前提是ALLOWED_VALUES有效的 python 名称。我希望在没有此限制的情况下具有相同的迭代行为。

我尝试过的

我尝试将其实现__iter__()staticmethodon ,这样就不需要使用Foo的实例来获取它。这允许我迭代,但会引发错误。这似乎是因为在 上查找方法,而不是在(因为是一个对象)上查找方法。FooIteratorFoo.__iter__()iter(Foo)iter(Foo)__iter__typeFooFootype

class Foo:
    """Class I want to iterate over without instantiating."""
    ALLOWED_VALUES = (1, 2, 3) …
Run Code Online (Sandbox Code Playgroud)

python static-methods iterator class magic-methods

5
推荐指数
1
解决办法
252
查看次数