enum中的payload获取

Hi, All
枚举中的payload获取我有些疑问。

  • 第一个是内置的Result[T, Err]
    有获取T的方法, 我没有找到获取Err的方法, 就是说, 希望能获取到Err, 而不是panic
  • 自定义的枚举, 如何获取payload, 是否需要提供unwrap0, unwrap1…这样的方法?
    比如
pub(all) enum Either[M, N] {
    Left(M)
    Right(N)
} derive(Show, Eq)

需要能够获取到M,N, 而不是Left(M), Right(N)
所以, 要提供如下方法吗? 不确定最佳实践是什么,

// unwarp0
pub fn unwrap0[M, N](self: Either[M, N]) -> M? {
  match self {
    Left(x) => Some(x)
    Right(_) => None
  }
}
// unwrap1
pub fn unwrap1[M, N](self: Either[M, N]) -> N? {
  match self {
    Left(_) => None
    Right(x) => Some(x)
  }
}

MoonBit 代码格式(Markdown)没用对哦

pub(all) enum Either[M, N] {
    Left(M)
    Right(N)
} derive(Show, Eq)
1 个赞

第一个问题:

fn get_error[T, E](result : Result[T, E]) -> E? {
  match result {
    Ok(_) => None
    Err(e) => Some(e)
  }
}

第二个问题,是的,但是你在什么场合下会有这样的需求?

具体的场景是这样的,
比如excel的formula, 其中的函数, 比如,

IF(logical, true_value, false_value)

因为目前不支持Any, 所以自定义了Either类型,
但是这个值需传递到其他地方, 比如传给js中的canvas进行绘制, 就需要原始的值M, 或N, 而不是Either

另外, 希望内置

Result[T, E]

提供get_error

guard let Err(e) = a // a : Result[T, E]